ข้อ จำกัด ต่างประเทศของ mysql เกิดข้อผิดพลาดอย่างไม่ถูกต้อง


173

ฉันมีสองตารางtable1เป็นตารางผู้ปกครองที่มีคอลัมน์IDและtable2มีคอลัมน์IDFromTable1(ไม่ใช่ชื่อจริง) เมื่อฉันใส่ FK ในIDFromTable1การIDในการที่ฉันได้รับข้อผิดพลาดtable1 Foreign key constraint is incorrectly formed errorฉันต้องการลบตารางที่ 2 หากtable1บันทึกถูกลบ ขอบคุณสำหรับความช่วยเหลือใด ๆ

ALTER TABLE `table2`  
   ADD CONSTRAINT `FK1` 
      FOREIGN KEY (`IDFromTable1`) REFERENCES `table1` (`ID`) 
      ON UPDATE CASCADE 
      ON DELETE CASCADE;

แจ้งให้เราทราบหากต้องการข้อมูลอื่นใด ฉันใหม่กับ mysql


4
คุณใช้เครื่องมืออะไรสำหรับตารางของคุณ อะไรประเภทของtable2.IDFromTable1และtable1.ID?
Romain

5
นอกจากนี้ตรวจสอบว่าชุดอักขระสำหรับทั้งสองตารางเหมือนกัน
Carsten

เอ็นจินตารางทั้งสองเป็น innoDB ไม่แน่ใจว่าจะหาชุดตัวอักษรได้ที่ไหนและทั้งคู่เป็นประเภทถ่าน ID เป็นคีย์หลักใน table1
user516883

2
โปรดระบุคำจำกัดความของตารางสำหรับ table1 และ table2 คุณได้รับข้อผิดพลาดนี้ได้อย่างไร คุณใช้เครื่องมือเพื่อสร้าง foreign key หรือไม่? ดูเหมือนว่าไม่ใช่ข้อผิดพลาดพื้นเมืองของ MySQL
Devart

@ user516883 - คุณต้องการความช่วยเหลือในการรับนิยามตารางหรือไม่? ใน HeidiSQL คุณสามารถคลิกที่แท็บสร้างรหัส
ÁlvaroGonzález

คำตอบ:


422

ฉันพบปัญหาเดียวกันกับ HeidiSQL ข้อผิดพลาดที่คุณได้รับนั้นลึกลับมาก ปัญหาของฉันก็คือว่าคอลัมน์คีย์ต่างประเทศและคอลัมน์อ้างอิงไม่ได้เป็นประเภทหรือความยาวเดียวกัน

คอลัมน์คีย์ต่างประเทศและคอลัมน์ที่อ้างอิงเป็นSMALLINT(5) UNSIGNED INT(10) UNSIGNEDเมื่อฉันทำให้พวกเขาทั้งสองประเภทที่แน่นอนเหมือนกันการสร้างคีย์ต่างประเทศทำงานได้อย่างสมบูรณ์


58
หรืออาจเป็นได้ว่าคอลัมน์ที่อ้างอิงไม่ใช่คีย์หลัก
nawfal

9
ค่อนข้างคล้ายปัญหาสำหรับฉัน - ตารางอ้างอิงยังไม่มีอยู่ อ๊ะ
Amalgovinus

5
ฉันเคยมีประสบการณ์โดยสิ้นเชิงกับสิ่งที่ Jake ทำ แต่ฉันพบปัญหา FK อื่น (ประเภทที่แตกต่าง) ใน HeidiSQL FK บน varchars จำเป็นต้องมีการเปรียบเทียบเดียวกัน หวังว่าจะช่วยคนอื่นในอนาคต!
cbloss793

10
ในกรณีของฉันมันเป็นเพราะการเข้ารหัสและการเรียงที่แตกต่างกัน
Khatri

1
@nawfal - ฉันเชื่อว่าไม่จำเป็นต้องเป็นคีย์หลัก แต่ต้องมีดัชนี ปุ่มหลักจะได้รับการจัดทำดัชนีโดยอัตโนมัติ
Itai

48

ฉันมีปัญหาเดียวกันเมื่อสร้างตารางแม่โดยใช้MyISAMเครื่องมือ เป็นความผิดพลาดที่ฉันแก้ไขด้วย:

ALTER TABLE parent_table ENGINE=InnoDB;

ขอบคุณมากฉันกำลังคลั่งไคล้กับสิ่งนี้ ความคิดใดที่ว่าทำไมฐานข้อมูลจะเปลี่ยนเอ็นจินเป็นตาราง?
Robert Franklin

28

ตรวจสอบให้แน่ใจคอลัมน์เหมือนกัน (ประเภทเดียวกัน) และถ้าคอลัมน์อ้างอิงไม่แน่ใจว่ามันคือprimary_keyINDEXED


มันเกิดขึ้นกับฉันว่าไม่มีข้อผิดพลาด แต่ไม่มีการเพิ่มรหัสต่างประเทศ (1 คือและ 1 ไม่ใช่จริง) แต่หลังจากเพิ่มง่าย ๆKEY referencing_column(referencing_column) ก่อนหน้าทั้งนิยามคีย์ต่างประเทศพวกเขาทั้งสองถูกเพิ่มสำเร็จ :)
jave.web

2
กุญแจของฉันที่ไม่ถูกทำดัชนีเป็นปัญหาของฉัน
Neil Masters

1
ฉันมีปัญหานี้และปัญหาคือฉันมีคีย์หลักสองคอลัมน์และคุณไม่สามารถใช้คอลัมน์ที่ 2 ของคีย์หลักเป็นคีย์ต่างประเทศได้ ดังนั้นฉันเพิ่งเพิ่มดัชนีของตัวเองสำหรับคอลัมน์ที่ 2 ของคีย์หลักแล้วมันก็ใช้ได้
Firze

21

ไวยากรณ์สำหรับการนิยามคีย์ต่างประเทศนั้นมีการให้อภัยอย่างมาก แต่สำหรับใครก็ตามที่สะดุดกับสิ่งนี้ความจริงที่ว่าคีย์ต่างประเทศจะต้องเป็น "ชนิดเดียวกัน" นั้นใช้ได้กับการเปรียบเทียบไม่ใช่แค่ชนิดข้อมูลและความยาวและบิต

ไม่ใช่ว่าคุณจะผสมการเปรียบเทียบในแบบจำลองของคุณ (จะเป็นอย่างไร) แต่ถ้าคุณทำต้องแน่ใจว่าฟิลด์หลักและกุญแจต่างประเทศของคุณเป็นประเภทการเปรียบเทียบเดียวกันใน phpmyadmin หรือ Heidi SQL หรือสิ่งที่คุณใช้

หวังว่านี่จะช่วยคุณประหยัดเวลาสี่ชั่วโมงในการลองผิดลองถูกและเสียค่าใช้จ่าย


1
ขอบคุณ! ปรากฎว่าโฮสต์ออนไลน์ของฉันใช้เอ็นจิ้น ISAM และสำหรับ dev ท้องถิ่นฉันใช้ InnoDB เมื่อฉันสำรองโต๊ะจากโฮสต์ไปยัง ... บูม
เบ็น

MariaDB รุ่นล่าสุดดูเหมือนจะใช้ utf8_mb4 เป็นชุดอักขระเริ่มต้น (เมื่อไม่ได้ตั้งค่าอย่างชัดเจนในการกำหนดค่าเซิร์ฟเวอร์) ดังนั้นCOLLATE utf8mb4_unicode_ciปัญหา (ที่ไม่คาดคิด) ของฉัน (บนเครื่อง dev)
JonnyJD

13

ฉันมีปัญหาเดียวกัน แต่แก้ไขได้

เพียงตรวจสอบให้แน่ใจว่าคอลัมน์ 'ID' ใน 'table1' มีดัชนีที่ไม่ซ้ำกัน !

และแน่นอนชนิดความยาวของคอลัมน์ 'ID' และ 'IDFromTable1' ในสองตารางนี้จะต้องเหมือนกัน แต่คุณรู้เรื่องนี้แล้ว


คุณทำวันของฉัน
kevenlolo

1
ดีใจที่ได้ช่วยเหลือ! ;)
Renat Gatin

ไม่แน่ใจรายละเอียด แต่ฉันมีคีย์ผสมกับข้อผิดพลาดนี้ซึ่งได้รับการแก้ไขโดยการเพิ่มดัชนีเฉพาะแต่ละคอลัมน์
Halvor Holsten Strand

คอลัมน์ที่อ้างอิงจะต้องได้รับการจัดทำดัชนีไม่จำเป็นต้องไม่ซ้ำกัน (แม้ว่าจะเป็นกรณีปกติ)
Barmar

10

เพื่อความสมบูรณ์

ข้อผิดพลาดนี้อาจเป็นกรณีเช่นกันหากคุณมีคีย์ต่างประเทศที่มี VARCHAR (.. ) และชุดอักขระของตารางที่อ้างอิงนั้นแตกต่างจากตารางที่อ้างอิง

เช่น VARCHAR (50) ในตาราง Latin1 นั้นแตกต่างจาก VARCHAR (50) ในตาราง UTF8


1
แม้ utf8_unicode_ci และ utf8_general_ci กำลังก่อให้เกิดข้อผิดพลาด
leuchtdiode

10

ข้อความแสดงข้อผิดพลาด mysql ไม่ได้ช่วยอะไรมากในกรณีของฉันคอลัมน์มีข้อ จำกัด "ไม่เป็นโมฆะ" ดังนั้นไม่อนุญาตให้ใช้ "ในการลบชุด null"


7

ถ้าทุกอย่างก็โอเคเพียงเพิ่มในตอนท้ายของ->unsigned();foregin key

หากไม่ได้ผลให้ตรวจสอบประเภทข้อมูลของทั้งสองฟิลด์ พวกเขาจะต้องเหมือนกัน


5

ฉันมีปัญหาเดียวกันทั้งสองคอลัมน์เป็น INT (11) ไม่เป็นโมฆะ แต่ฉันไม่สามารถสร้างคีย์ต่างประเทศได้ ฉันต้องปิดการใช้งานการตรวจสอบกุญแจต่างประเทศเพื่อให้ทำงานได้สำเร็จ:

SET FOREIGN_KEY_CHECKS=OFF;
ALTER TABLE ... ADD CONSTRAINT ...
SET FOREIGN_KEY_CHECKS=ON;

หวังว่านี่จะช่วยใครซักคน


4
อันที่จริงแล้วมันคือ FOREIGN_KEY_CHECKS
Xmanoux

สิ่งนี้ช่วยให้ฉันผ่านไปได้อีกต่อไป แต่ปัญหาของฉันขาดดัชนีปฐมภูมิในคอลัมน์
bumerang

4

สาเหตุที่เป็นไปได้อีกประการหนึ่งสำหรับการแสดงข้อผิดพลาดนี้ ลำดับที่ฉันกำลังสร้างตารางนั้นผิด ฉันพยายามอ้างอิงคีย์จากตารางที่ยังไม่ได้สร้าง


4

(ส่งซ้ำครั้งล่าสุด) แม้ว่าชื่อเขตข้อมูลและชนิดข้อมูลจะเหมือนกัน แต่การเปรียบเทียบไม่เหมือนกัน แต่จะส่งผลให้เกิดปัญหาดังกล่าว

ตัวอย่างเช่น

    TBL NAME | ประเภทข้อมูล | การตรวจทาน        

    ActivityID | INT |         latin1_general_ci     ActivityID | INT |         utf8_general_ci

ลองเปลี่ยนเป็น

    TBL NAME | ประเภทข้อมูล | การตรวจทาน        

    ActivityID | INT |         latin1_general_ci     ActivityID | INT |         latin1_general_ci

....

สิ่งนี้ใช้ได้สำหรับฉัน


3

ตรวจสอบตารางเอ็นจิ้นทั้งสองโต๊ะจะต้องเป็นเอนจิ้นเดียวกันที่ช่วยฉันได้มาก


จุดดี! ฉันกำลังจัดการกับฐานข้อมูล Zen Cart ใน MySQL ที่มีตารางทั้งหมดในเครื่องมือ MyISAM โดยค่าเริ่มต้น ฉันเพิ่มตารางโดยใช้เอ็นจิ้น InnoDB และพยายามเพิ่มข้อ จำกัด กุญแจต่างประเทศจากตารางของฉันไปยัง Core Zen Cart หนึ่ง มันล้มเหลวด้วยข้อผิดพลาด คุณสามารถดูเครื่องยนต์สำหรับแต่ละตารางด้วยSHOW TABLE STATUS LIKE 'table_name';
Neek

2

ฉันมีปัญหาเดียวกัน

ปัญหาคือคอลัมน์อ้างอิงไม่ใช่คีย์หลัก

ทำให้เป็นคีย์หลักและแก้ไขปัญหาได้แล้ว


มันไม่จำเป็นต้องเป็น PK แต่ก็สามารถเป็น UNIQUE NOT NULL ได้
philipxy

ที่จริง ... ในกรณีของฉันเพียงแค่ตั้งค่าให้เป็นประเภทดัชนีปกติทำงาน
hendr1x

2

แม้ว่าคำตอบอื่น ๆ นั้นค่อนข้างมีประโยชน์ แต่ก็อยากแบ่งปันประสบการณ์ของฉันเช่นกัน

ฉันประสบปัญหาเมื่อฉันลบตารางที่idถูกอ้างอิงเป็นคีย์ต่างประเทศในตารางอื่น ๆ ( พร้อมข้อมูล ) แล้วพยายามสร้าง / นำเข้าตารางใหม่ด้วยคอลัมน์เพิ่มเติมบางส่วน

แบบสอบถามเพื่อการพักผ่อนหย่อนใจ (สร้างขึ้นใน phpMyAdmin) ดูเหมือนว่าต่อไปนี้:

CREATE TABLE `the_table` (
  `id` int(11) NOT NULL,            /* No PRIMARY KEY index */  
  `name` varchar(255) NOT NULL,
  `name_fa` varchar(255) NOT NULL,
  `name_pa` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

... /* SOME DATA DUMP OPERATION */

ALTER TABLE `the_table`
  ADD PRIMARY KEY (`id`), /* PRIMARY KEY INDEX */
  ADD UNIQUE KEY `uk_acu_donor_name` (`name`);

ดังที่คุณอาจสังเกตเห็นPRIMARY KEYดัชนีถูกตั้งค่าหลังจากการสร้าง ( และการแทรกข้อมูล ) ซึ่งทำให้เกิดปัญหา

สารละลาย

วิธีการแก้ไขคือการเพิ่มPRIMARY KEYดัชนีในแบบสอบถามคำจำกัดความของตารางสำหรับสิ่งidที่ถูกอ้างอิงเป็น foreign key ในขณะที่ลบออกจากALTER TABLEส่วนที่ดัชนีถูกตั้งค่า:

CREATE TABLE `the_table` (
  `id` int(11) NOT NULL PRIMARY KEY,            /* <<== PRIMARY KEY INDEX ON CREATION */  
  `name` varchar(255) NOT NULL,
  `name_fa` varchar(255) NOT NULL,
  `name_pa` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

มันใช้งานได้สำหรับฉัน ฉันกังวลว่าฉันต้องติดตั้งซอฟต์แวร์ใหม่อีกครั้ง)
Dewlance

2

ฉันเสียชั่วโมงไปแล้ว!

PK ในตารางหนึ่งอยู่ในอีกตารางหนึ่งutf8คือutf8_unicode_ci!


1

ลองเรียกใช้ต่อไปนี้:

แสดงสร้างตารางผู้ปกครอง

// และตรวจสอบว่าประเภทของตารางทั้งสองเหมือนกันเช่น myISAM หรือ innoDB เป็นต้น
// แง่มุมอื่น ๆ สำหรับตรวจสอบด้วยข้อความแสดงข้อผิดพลาดนี้: คอลัมน์ที่ใช้เป็นภาษาต่างประเทศ 
คีย์จะต้องถูกจัดทำดัชนีพวกเขาจะต้องเป็นประเภทเดียวกัน 
(ถ้าเช่นหนึ่งคือประเภท smallint (5) และอื่น ๆ ประเภท smallint (6) 
มันจะไม่ทำงาน) และถ้าเป็นจำนวนเต็มก็ควรไม่ได้ลงนาม

// หรือตรวจสอบชุดอักขระ
แสดงตัวแปรเช่น "character_set_database";
แสดงตัวแปรเช่น "collation_database";

// แก้ไข: ลองอะไรเช่นนี้
แก้ไขตารางที่ 2
เพิ่ม CONSTRAINT fk_IdTable2
KEY ต่างประเทศ (Table1_Id)
อ้างอิง Table1 (Table1_Id)
เกี่ยวกับการปรับปรุง CASCADE 
เมื่อลบแบบเรียงซ้อน;

9
ลองใช้ SHOW ENGINE INNODB STATUS เพื่อรับรายละเอียดเพิ่มเติมเกี่ยวกับข้อผิดพลาด
Sudhir Bastakoti

@SudhirBastakoti - +1! นั่นทำเพื่อฉัน รายละเอียดมีประโยชน์ ก็สามารถที่จะแก้ไขปัญหาได้อย่างรวดเร็ว
Paul Carlton

1

ฉันมีปัญหาเดียวกันกับ Symfony 2.8

ตอนแรกฉันไม่เข้าใจเพราะไม่มีปัญหาเรื่องความยาวของรหัสต่างประเทศ ฯลฯ

ในที่สุดฉันก็ต้องทำสิ่งต่อไปนี้ในโฟลเดอร์โครงการ (การรีสตาร์ทเซิร์ฟเวอร์ไม่ได้ช่วย!)

app/console doctrine:cache:clear-metadata app/console doctrine:cache:clear-query app/console doctrine:cache:clear-result


1

ขอบคุณ S Doerin:

"เพิ่งเสร็จสิ้นข้อผิดพลาดนี้อาจเป็นกรณีนี้หากคุณมีคีย์ต่างประเทศที่มี VARCHAR (.. ) และชุดอักขระของตารางที่อ้างอิงจะแตกต่างจากตารางที่อ้างอิงเช่น VARCHAR (50) ในตาราง Latin1 คือ แตกต่างจาก VARCHAR (50) ในตาราง UTF8 "

ฉันแก้ไขปัญหานี้ได้โดยเปลี่ยนประเภทของอักขระของตาราง การสร้างมี latin1 และที่ถูกต้องคือ utf8

เพิ่มบรรทัดถัดไป ตั้งค่าตัวอักษรเริ่มต้น = utf8;


1

ฉันมีปัญหาในการใช้ตาราง Alter เพื่อเพิ่มคีย์ต่างประเทศระหว่างสองตารางและสิ่งที่ช่วยฉันตรวจสอบให้แน่ใจว่าแต่ละคอลัมน์ที่ฉันพยายามเพิ่มความสัมพันธ์กับคีย์ต่างประเทศที่ได้รับการจัดทำดัชนี ในการทำเช่นนี้ใน PHP myAdmin: ไปที่ตารางและคลิกที่แท็บโครงสร้าง คลิกตัวเลือกดัชนีเพื่อสร้างดัชนีคอลัมน์ที่ต้องการตามที่แสดงในภาพหน้าจอ:

ป้อนคำอธิบายรูปภาพที่นี่

เมื่อฉันจัดทำดัชนีทั้งสองคอลัมน์ฉันพยายามอ้างอิงกับกุญแจต่างประเทศของฉันฉันก็สามารถใช้ตารางแก้ไขและสร้างความสัมพันธ์กับกุญแจต่างประเทศได้สำเร็จ คุณจะเห็นว่ามีการจัดทำดัชนีคอลัมน์เหมือนในภาพหน้าจอด้านล่าง:

ป้อนคำอธิบายรูปภาพที่นี่

สังเกตว่า zip_code แสดงในตารางทั้งสองอย่างไร


1

คุณต้องตรวจสอบว่าทั้งคู่เหมือนกันในคุณสมบัติทั้งหมดรวมอยู่ใน "การจัดเรียง"


1

ฉันใช้HeidiSQLและเพื่อแก้ปัญหานี้ฉันต้องสร้างดัชนีในตารางอ้างอิงโดยมีคอลัมน์ทั้งหมดที่ถูกอ้างอิง

เพิ่มดัชนีลงในตาราง Heidisql


เช่นเดียวกันสำหรับฉันใน mysql: InnoDB ต้องการดัชนีในคีย์ต่างประเทศและรหัสอ้างอิงเพื่อให้การตรวจสอบคีย์ต่างประเทศนั้นรวดเร็วและไม่ต้องใช้การสแกนตาราง
hendr1x

1

ฉันพบปัญหาเดียวกันในตอนนี้ ในกรณีของฉันสิ่งที่ฉันต้องทำก็คือเพื่อให้แน่ใจว่าต้องสร้างตารางที่ฉันอ้างถึงใน foreign key ก่อนตารางปัจจุบัน (ก่อนหน้านี้ในรหัส) ดังนั้นหากคุณกำลังอ้างอิงตัวแปร (x * 5) ระบบควรรู้ว่า x คืออะไร (x ต้องประกาศในบรรทัดรหัสก่อนหน้า) สิ่งนี้สามารถแก้ไขปัญหาของฉันได้หวังว่าจะช่วยคนอื่นได้


ฉันมีปัญหาเดียวกันใน MariaDB v10.3.18 เราเคยใช้ MySQL มาก่อนและมันเตือนว่ากุญแจต่างประเทศชี้ไปที่ตารางที่ไม่มีอยู่จริง
MarthyM

0

ฉันมีปัญหาเดียวกันกับตัวสร้างโครงสร้างการโยกย้าย Laravel 5.1 กับ MariaDB 10.1

ปัญหาคือฉันได้พิมพ์unignedแทนunsigned( sจดหมายหายไป) ขณะตั้งค่าคอลัมน์

หลังจากแก้ไขข้อผิดพลาดการพิมพ์ผิดได้รับการแก้ไขสำหรับฉัน


0

แม้ว่าฉันจะพบปัญหาเดียวกันกับ mysql และ liquibase ดังนั้นนี่คือปัญหาคือ: ตารางที่คุณต้องการอ้างอิงคอลัมน์ของตารางอื่นนั้นแตกต่างกันในกรณีของประเภทข้อมูลหรือในแง่ของขนาดของประเภทข้อมูล

Error appears in below scenario:
Scenario 1:
Table A has column id, type=bigint
Table B column referenced_id type varchar(this column gets the value from the id column of Table A.)
Liquibase changeset for table B:

    <changeset id="XXXXXXXXXXX-1" author="xyz">
            <column name="referenced_id" **type="varchar"**>
        </column>
            </changeset>
    <changeSet id="XXXXXXXXXXX-2" author="xyz">
                <addForeignKeyConstraint constraintName="FK_table_A"
                    referencedTableName="A" **baseColumnNames="referenced_id**"
                    referencedColumnNames="id" baseTableName="B" />
    </changeSet>

Table A changeSet:

    <changeSet id="YYYYYYYYYY" author="xyz">
     <column **name="id"** **type="bigint"** autoIncrement="${autoIncrement}">
                    <constraints primaryKey="true" nullable="false"/>
                </column>
    </changeSet>

Solution: 
correct the type of table B to bigint because the referenced table has type bigint.

Scenrario 2:
The type might be correct but the size might not.
e.g. :
Table B : referenced column type="varchar 50"
Table A : base column type ="varchar 255"

Solution change the size of referenced column to that of base table's column size.

0

ตรวจสอบว่าคุณได้ระบุชื่อของตารางในกรณีที่ถูกต้อง (ถ้าชื่อตารางเป็นกรณี ๆ ไปในฐานข้อมูลของคุณ) ในกรณีของฉันฉันต้องเปลี่ยน

 CONSTRAINT `FK_PURCHASE_customer_id` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`id`) ON UPDATE CASCADE ON DELETE CASCADE

ถึง

 CONSTRAINT `FK_PURCHASE_customer_id` FOREIGN KEY (`customer_id`) REFERENCES `CUSTOMER` (`id`) ON UPDATE CASCADE ON DELETE CASCADE

ทราบเปลี่ยนไปcustomerCUSTOMER


0

หรือคุณสามารถใช้ DBDesigner4 ซึ่งมีส่วนต่อประสานกราฟิกเพื่อสร้างฐานข้อมูลของคุณและเชื่อมโยงพวกเขาโดยใช้ FK คลิกขวาที่ตารางของคุณและเลือก 'คัดลอกตาราง SQL สร้าง' ซึ่งสร้างรหัส

ป้อนคำอธิบายรูปภาพที่นี่


0

มันเป็นเรื่องเก่า แต่ฉันค้นพบบางสิ่ง ในขณะที่สร้างโต๊ะทำงาน MySQL มันยังได้รับความสัมพันธ์ของตารางอื่น เพียงแค่ทิ้งเสาหลักที่คุณเกี่ยวข้อง ล้างคอลัมน์อื่น ๆ ที่เพิ่มโดยอัตโนมัติ มันใช้งานได้สำหรับฉัน


0

กรณีของฉันคือฉันมีการพิมพ์ผิดในคอลัมน์ที่อ้างถึง:

MariaDB [blog]> alter table t_user add FOREIGN KEY ( country_code ) REFERENCES t_country ( coutry_code );
ERROR 1005 (HY000): Can't create table `blog`.`t_user` (errno: 150 "Foreign key constraint is incorrectly formed")

ข้อความแสดงข้อผิดพลาดค่อนข้างคลุมเครือและฉันได้ลองทุกอย่างแล้ว - ตรวจสอบประเภทของคอลัมน์การเรียงหน้าเอนจิ้น ฯลฯ

ฉันใช้เวลาสักครู่เพื่อบันทึกการพิมพ์ผิดและหลังจากการแก้ไขมันทำงานได้ดี:

MariaDB [blog]> alter table t_user add FOREIGN KEY ( country_code ) REFERENCES t_country ( country_code );
Query OK, 2 rows affected (0.039 sec)              
Records: 2  Duplicates: 0  Warnings: 0

0

ฉันประสบปัญหานี้ข้อผิดพลาดมาเมื่อคุณใส่คีย์หลักในประเภทข้อมูลที่แตกต่างกันเช่น:

ตารางที่ 1:

 Schema::create('products', function (Blueprint $table) {
            $table->increments('id');
            $table->string('product_name');
        });

ตารางที่ 2:

Schema::create('brands', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('brand_name');
        });

ชนิดข้อมูลสำหรับ id ของตารางที่สองจะต้องเพิ่มขึ้น


0

ปัญหาง่ายมากในการแก้

เช่น: คุณมีสองตารางที่มีชื่อผู้ใช้และโพสต์และคุณต้องการสร้างคีย์ต่างประเทศในตารางโพสต์และคุณใช้ phpMyAdmin

1) ในโพสต์ตารางเพิ่มคอลัมน์ใหม่ ( ชื่อ : use_id | ประเภท : เช่นidในตารางผู้ใช้ | ความยาว : เช่นเดียวกับidในตารางผู้ใช้ | ค่าเริ่มต้น : NULL | แอตทริบิวต์ : ดัชนีที่ไม่ได้ลงนาม: INDEX)

2) บนแท็บโครงสร้างไปที่มุมมองความสัมพันธ์ ( ชื่อข้อ จำกัด : ชุดอัตโนมัติโดย phpmyAdmin | ชื่อคอลัมน์ : เลือก user_id | ตาราง : ผู้ใช้ | สำคัญ : id, ... )

มันถูกแก้ไขอย่างง่ายดาย

javad mosavi อิหร่าน / urmia

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.