MySQL: สร้างตารางไม่ได้ (errno: 150)


156

ฉันกำลังพยายามนำเข้าไฟล์. sql และความล้มเหลวในการสร้างตาราง

นี่คือแบบสอบถามที่ล้มเหลว:

CREATE TABLE `data` (
`id` int(10) unsigned NOT NULL,
`name` varchar(100) NOT NULL,
`value` varchar(15) NOT NULL,
UNIQUE KEY `id` (`id`,`name`),
CONSTRAINT `data_ibfk_1` FOREIGN KEY (`id`) REFERENCES `keywords` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;    

ฉันส่งออก. sql จากฐานข้อมูลเดียวกันฉันลบตารางทั้งหมดและตอนนี้ฉันพยายามนำเข้ามันทำไมมันล้มเหลว?

MySQL: ไม่สามารถสร้างตาราง './dbname/data.frm' (errno: 150)


1
สำหรับสาเหตุสำคัญทั้งหมดของข้อผิดพลาดนี้นี่คือทรัพยากรครบถ้วนสมบูรณ์สำหรับสิ่งที่ทำให้ errno 150 (และ errno 121 / ข้อผิดพลาดที่สำคัญต่างประเทศอื่น ๆ ) ใน MySQL
John Smith

21
ฉันพบว่าคอลัมน์ต้องเหมือนกัน (แม้จะต้องมีเครื่องหมายที่ไม่ได้ลงชื่อ)
Justin Skiles

3
@JohnSmith ... อยู่ที่ไหน
Charles Wood

3
ฉันขอแนะนำให้อ่านโพสต์บล็อกนี้ซึ่งระบุสาเหตุที่เป็นไปได้ 10 ข้อ: verysimple.com/2006/10/22/ …
ทำเครื่องหมาย Amery

@CharlesWood: " John Smith ... เห็น 6 เม.ย. 13 เวลา 19:29 " นั่นคือประมาณสามเดือนก่อนความคิดเห็นของคุณ ฉันมีความกลัวว่าความลึกลับของ "ที่" จะไม่ถูกเปิดเผยจนกว่าจะถึงจุดจบของโลกนี้! :>
trejder

คำตอบ:


167

จากMySQL - เอกสารสำคัญข้อ จำกัด ต่างประเทศ :

หากคุณสร้างตารางที่ถูกทิ้งใหม่จะต้องมีคำจำกัดความที่สอดคล้องกับข้อ จำกัด ของคีย์ต่างประเทศที่อ้างอิงถึง ต้องมีชื่อคอลัมน์และประเภทที่ถูกต้องและจะต้องมีดัชนีในคีย์อ้างอิงตามที่ระบุไว้ก่อนหน้า หากสิ่งเหล่านี้ไม่เป็นที่พอใจ MySQL จะส่งกลับข้อผิดพลาด 1005 และอ้างถึงข้อผิดพลาด 150 ในข้อความแสดงข้อผิดพลาดซึ่งหมายความว่ามีข้อ จำกัด ของคีย์ต่างประเทศเกิดขึ้นไม่ถูกต้อง ในทำนองเดียวกันหาก ALTER TABLE ล้มเหลวเนื่องจากเกิดข้อผิดพลาด 150 หมายความว่าข้อกำหนดคีย์ foreign จะเกิดขึ้นอย่างไม่ถูกต้องสำหรับตารางที่เปลี่ยนแปลง


1
สามารถสองคอลัมน์จากตารางหนึ่งอ้างอิงหนึ่งคอลัมน์จากอีกตารางหนึ่งได้ไหมว่าอยู่ที่ไหน PK
ยูจีน

1
@Eugene: แต่ละคอลัมน์สองคอลัมน์สามารถมีความสัมพันธ์กับ foreign key กับ PK ในตารางอื่น - ไม่ใช่ทั้งสองคอลัมน์เป็นความสัมพันธ์กับ foreign key อันเดียว
OMG Ponies

1
@OMGPonies: ขอบคุณที่ตอบคำถามนี้! .. ฉันกำลังมองหามัน ... ฉันยังถามคำถามที่นี่stackoverflow.com/questions/13487010/… .... แม้ว่าฉันจะมีคำตอบที่ดี แต่ฉันต้องการที่จะสอดคล้องWhether its possible to write Nested Query for my problem? .. ฉันขอให้คุณช่วยตอบฉันด้วย!
Grijesh Chauhan

19
ข้อผิดพลาดของฉันคือตารางหลักมี MyISAM และตารางย่อยของเด็กเครื่องยนต์ InnoDB สคริปต์ create.sql ปัจจุบันใช้ InnoDB สำหรับตารางทั้งหมด แต่ฉันมีการติดตั้งที่เก่ามากซึ่งสคริปต์แรกใช้ MyISAM
Whome

2
@Whome - ใช่วิ่งเข้าไปในปัญหาเดียวกันที่นี่
aroth

96

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


15
ขอบคุณ :) สำหรับฉันประเภทข้อมูลเป็น INT แต่ไม่ได้ลงนามในขณะที่อื่น ๆ ไม่ได้
Anh Nguyen

6
ฉันมักจะวิ่งข้ามBIGINTvs INTเมื่อใช้เครื่องกำเนิดไฟฟ้าสคีมา
Xeoncross

ฉันพบปัญหาเดียวกันเมื่อรหัสต่างประเทศไม่ใช่ค่า INT คอลัมน์จะต้องไม่ซ้ำกันเมื่อ foreign key อ้างถึงมัน
PhatHV

62

คุณสามารถได้รับข้อความแสดงข้อผิดพลาดจริงโดยการเรียกใช้SHOW ENGINE INNODB STATUS;แล้วค้นหาLATEST FOREIGN KEY ERRORในผลลัพธ์

ที่มา: คำตอบจากผู้ใช้รายอื่นในคำถามที่คล้ายกัน


7
มันมีประโยชน์มากจริงๆ มันจะบอกคุณถึงข้อผิดพลาดที่แน่นอน
Csongor Fagyal

ขอบคุณ น่าเสียดายที่ MySQL Workbench ไม่ได้ใช้สิ่งนี้
scipilot

น่ากลัว สิ่งนี้มีประโยชน์มาก บอกให้คุณทราบถึงข้อผิดพลาดที่แน่นอน ฉันเคยทำคอลัมน์ NULLABLE แล้ว แต่ได้ตั้ง "ในการลบชุด null" ขอบคุณมาก.
Abhishek Saini

หากคุณมีสิทธิ์ใช้งานบนเซิร์ฟเวอร์ของคุณ :(
Christopher Smit

30

ประเภทข้อมูลจะต้องตรงกันทุกประการ หากคุณกำลังจัดการกับประเภท varchar ตารางจะต้องใช้การเปรียบเทียบที่เหมือนกัน


4
ขอบคุณสำหรับการเปรียบเทียบบิต
arahant

25

ฉันคิดว่าคำตอบทั้งหมดเหล่านี้ในขณะที่ถูกต้องทำให้เข้าใจผิดกับคำถาม

คำตอบที่แท้จริงคือสิ่งนี้ก่อนที่คุณจะเริ่มต้นการกู้คืนหากคุณกำลังกู้คืนไฟล์ดัมพ์ด้วย foreign key:

SET FOREIGN_KEY_CHECKS=0;

เพราะโดยปกติการคืนค่าจะสร้างข้อ จำกัด บางอย่างก่อนที่จะมีตารางต่างประเทศอยู่


การทำเช่นนี้ไม่ได้ผลสำหรับฉันยังคงให้ข้อผิดพลาด ความคิดใด ๆ
โจเซฟ

24

ในบางกรณีคุณอาจพบข้อความแสดงข้อผิดพลาดนี้หากมีเอ็นจินต่างกันระหว่างตารางที่เกี่ยวข้อง ตัวอย่างเช่นตารางอาจใช้ InnoDB ในขณะที่อีกตารางใช้ MyISAM ทั้งสองต้องเหมือนกัน


ขอบคุณ - นี่คือปัญหาของฉัน
scipilot

นั่นคือปัญหาของฉัน ขอบคุณ
thed0ctor

สิ่งนี้สามารถเกิดขึ้นได้หากคุณสร้างไฟล์ sql ของตาราง innodb โดยใช้ mysqldump และส่งออกเป็นไฟล์ myisam talbes แทน
Amado Martinez

11

หมายเลขข้อผิดพลาด 150 หมายถึงการ จำกัด คีย์ต่างประเทศล้มเหลว คุณอาจสร้างตารางนี้ก่อนตารางที่คีย์ต่างประเทศขึ้นอยู่กับ (ตารางkeywords ) สร้างตารางนั้นก่อนและควรจะทำงานได้ดี

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


10

มีบางสิ่งบางอย่างที่สามารถทำให้ errno 150 ได้ดังนั้นสำหรับผู้ที่ค้นหาหัวข้อนี้นี่คือสิ่งที่ฉันคิดว่าใกล้เคียงกับรายการครบถ้วนสมบูรณ์ ( สาเหตุที่มาของ Errno 150 ):

สำหรับ errno 150 หรือ errno 121 เพียงพิมพ์ใน SHOW ENGINE INNODB STATUS มีส่วนที่เรียกว่า "LATEST KEY ERROR KEY ล่าสุด" ภายใต้มันจะให้ข้อความแสดงข้อผิดพลาดที่มีประโยชน์มากซึ่งโดยทั่วไปจะบอกคุณทันทีว่าเกิดอะไรขึ้น คุณต้องมีสิทธิ์พิเศษในการใช้งานดังนั้นหากคุณไม่มีคุณจะต้องทดสอบสถานการณ์ต่อไปนี้

1) ประเภทข้อมูลไม่ตรงกัน: ประเภทของคอลัมน์จะต้องเหมือนกัน

2) คอลัมน์หลักที่ไม่ได้จัดทำดัชนี (หรือจัดทำดัชนีตามลำดับที่ไม่ถูกต้อง)

3) การเรียงคอลัมน์ไม่ตรงกัน

4) การใช้ SET NULL ในคอลัมน์ NOT NULL

5) การจัดเรียงตารางไม่ตรงกัน: แม้ว่าการเรียงคอลัมน์จะตรงกัน แต่ใน MySQL บางรุ่นอาจเป็นปัญหาได้

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

7) ดัชนีหนึ่งในคอลัมน์ใดคอลัมน์หนึ่งไม่สมบูรณ์หรือคอลัมน์ยาวเกินไปสำหรับดัชนีที่สมบูรณ์ โปรดทราบว่า MySQL (เว้นแต่คุณจะปรับแต่งมัน) มีความยาวสูงสุดของคีย์คอลัมน์เดี่ยวสูงสุด 767 ไบต์ (ซึ่งตรงกับคอลัมน์ varchar (255) UTF)

ในกรณีที่คุณได้รับ errno 121 ต่อไปนี้เป็นสาเหตุสองประการ:

1) ชื่อข้อ จำกัด ที่คุณเลือกนั้นถูกใช้ไปแล้ว

2) ในบางระบบหากมีกรณีที่แตกต่างกันในคำสั่งและชื่อตารางของคุณ สิ่งนี้อาจกัดคุณได้หากคุณไปจากเซิร์ฟเวอร์หนึ่งไปยังเซิร์ฟเวอร์อื่นที่มีกฎการจัดการเคสที่แตกต่างกัน


ในบางรุ่นคุณจะได้รับ errno 150 หากโต๊ะไม่ใช่ innodb แต่ในบางรุ่นมันจะล้มเหลวอย่างเงียบ ๆ
juacala

ขอบคุณนี่เป็นสิ่งที่ยอดเยี่ยม: | ------------------------ | คีย์ข้อผิดพลาดล่าสุดจากต่างประเทศ ------------------------ | คุณได้กำหนดเงื่อนไข SET NULL ผ่านบางส่วนของ | คอลัมน์ถูกกำหนดเป็น NOT NULL
Sam Critchley

8

บางครั้ง MySQL ก็แค่โง่สุด ๆ - ฉันสามารถเข้าใจสาเหตุของคีย์ต่างประเทศ .. แต่ในกรณีของฉันฉันเพิ่งลบฐานข้อมูลทั้งหมดและฉันยังได้รับข้อผิดพลาด ... ทำไม? ฉันหมายความว่าไม่มีฐานข้อมูลอีกต่อไป ... และผู้ใช้ sql ที่ฉันใช้ไม่สามารถเข้าถึงฐานข้อมูลอื่น ๆ บนเซิร์ฟเวอร์ ... ฉันหมายถึงเซิร์ฟเวอร์คือ "ว่าง" สำหรับผู้ใช้ปัจจุบันและฉันยังคงได้รับ ข้อผิดพลาดนี้? ขออภัย แต่ฉันเดาว่า MySQL กำลังโกหกฉัน ... แต่ฉันสามารถจัดการกับมันได้ :) แค่เพิ่ม SQL สองบรรทัดนี้ลงไปในคำแถลงของคุณ:

SET FOREIGN_KEY_CHECKS = 0;
# some code that gives you errno: 150
SET FOREIGN_KEY_CHECKS = 1;

ตอนนี้ sql ควรได้รับการดำเนินการ ... หากคุณมีปัญหาเกี่ยวกับกุญแจต่างประเทศจริง ๆ มันจะปรากฏขึ้นที่บรรทัดที่คุณจะเปิดใช้งานการตรวจสอบอีกครั้ง - นี่จะล้มเหลวแล้ว แต่เซิร์ฟเวอร์ของฉันเงียบ :)


นี่อาจทำให้เกิดปัญหาหากมีความแตกต่างระหว่างคอลัมน์และคอลัมน์ที่อ้างอิงจริง ตัวอย่างเช่น สมมติว่าคอลัมน์อ้างอิงคือ varchar (200) และผู้อ้างอิงคือ varchar (50) จากนั้นเมื่อมีการพยายามเรียงซ้อนลักษณะการทำงานที่แปลกอาจเกิดขึ้นได้ ฉันไม่ได้พบปัญหาที่มีการออก errno 150 เนื่องจากข้อมูลไม่ตรงกัน
juacala

ข้อมูลเชิงลึกที่น่าสนใจ @juacala :) ตลกสำหรับฉันเท่านั้นเมื่อใดก็ตามที่ฉันพบสิ่งนี้วิธีการของฉันจะแก้ไขมันเสมอ ... จนถึงทุกวันนี้อย่างน้อย: D แต่เราไม่เคยหยุดเรียนรู้ใช่มั้ย;)
jebbie

สิ่งนี้ช่วยฉันในการสร้างสคริปต์ liquibase สคริปต์รันไม่มีที่ติบน MySQL> 5.5 แต่ล้มเหลวสำหรับเวอร์ชัน 5.1
delbertooo

4

หลังจากล่องเรือผ่านคำตอบข้างต้นและทำการทดลองเล็กน้อยนี่เป็นวิธีที่มีประสิทธิภาพในการแก้ไขข้อผิดพลาด Foreign Key ใน MySQL (1005 - ข้อผิดพลาด 150)

เพื่อให้สร้าง foreign key ได้อย่างถูกต้อง MySQL ทั้งหมดจะถามหาคือ:

  • คีย์ที่อ้างอิงทั้งหมดต้องมีดัชนีหลักหรือ UNIQUE
  • คอลัมน์การอ้างอิงอีกครั้งต้องมีชนิดข้อมูลที่เหมือนกันกับคอลัมน์ที่อ้างอิง

ตอบสนองความต้องการเหล่านี้และทุกอย่างจะดี


4

ฉันพบข้อผิดพลาดนี้เมื่อทำการเชื่อมต่อแอปพลิเคชัน Windows ไปยัง Linux ใน Windows ชื่อตารางฐานข้อมูลไม่คำนึงถึงขนาดตัวพิมพ์และใน Linux จะคำนึงถึงขนาดตัวพิมพ์ ดังนั้นในตาราง Windows Table1จะเหมือนกับtable1และในREFERENCESทั้งสองtable1และใช้Table1งานได้ บน Linux เมื่อแอปพลิเคชันใช้table1แทนTable1เมื่อสร้างโครงสร้างฐานข้อมูลฉันเห็นข้อผิดพลาด # 150; เมื่อฉันสร้างตัวละครที่ถูกต้องในTable1การอ้างอิงมันเริ่มทำงานบน Linux ด้วย ดังนั้นหากไม่มีสิ่งใดช่วยคุณได้โปรดตรวจสอบให้แน่ใจว่าREFERENCESคุณใช้ตัวอักษรถูกต้องในชื่อตารางเมื่อคุณใช้ Linux


นี่ก็เป็นกรณีของฉันด้วย! การย้ายสคริปต์จาก case-insensitive (OS X) ไปยัง mysql version (Debian)
mircealungu

3

เปลี่ยนเอ็นจิ้นของตารางของคุณเฉพาะ InnoDB รองรับคีย์ต่างประเทศ


3

หากตาราง PK ถูกสร้างขึ้นในCHARSETหนึ่งและจากนั้นคุณสร้างตาราง FK ใน CHARSET อื่น .. จากนั้นคุณอาจได้รับข้อผิดพลาดนี้ ... ฉันได้รับข้อผิดพลาดนี้เช่นกัน แต่หลังจากเปลี่ยน charset เป็น PK charset แล้วมันก็ถูกดำเนินการโดยไม่มีข้อผิดพลาด

create table users
(
------------
-------------
)DEFAULT CHARSET=latin1;


create table Emp
(
---------
---------
---------
FOREIGN KEY (userid) REFERENCES users(id) on update cascade on delete cascade)ENGINE=InnoDB, DEFAULT CHARSET=latin1;

3

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


3

ในกรณีส่วนใหญ่ปัญหาเกิดจากความผิดปกติของเครื่องยนต์หากผู้ปกครองสร้างขึ้นโดย InnoDB ดังนั้นตารางอ้างอิงที่ควรถูกสร้างขึ้นโดย MyISAM & ในทางกลับกัน


3

ในกรณีของฉัน ฉันมีปัญหากับเอ็นจิ้นและชุดอักขระเนื่องจากเซิร์ฟเวอร์ของฉันเปลี่ยนการตั้งค่าการโฮสต์และตารางใหม่ของฉันคือ MyISAM แต่ตารางเก่าของฉันคือ InnoDB แค่ฉันเปลี่ยน


สิ่งนี้ถูกต้องสำหรับฉันเพราะฉันกำลังแก้ไขฐานข้อมูลที่ฉันไม่ได้ทำ
FonzTech

3

โดยทั่วไปความไม่ตรงกันระหว่าง foreign key & primary key ทำให้เกิดข้อผิดพลาด: 150

ต่างประเทศที่สำคัญจะต้องมีเหมือนกันประเภทข้อมูลเป็นคีย์หลัก นอกจากนี้ถ้าคีย์หลักจะไม่มีการลงชื่อแล้วต่างประเทศที่สำคัญยังต้องไม่มีการลงชื่อ


3

ฉันมีปัญหาเดียวกัน มันเกี่ยวข้องกับคอลัมน์ของตารางเปรียบเทียบและชุดตัวอักษร ตรวจสอบให้แน่ใจว่าชุดอักขระและการเรียงจะต้องเหมือนกันสำหรับทั้งสองคอลัมน์ในสองตาราง หากคุณต้องการตั้งรหัสต่างประเทศในนั้น ตัวอย่าง - ถ้าคุณใส่ foreign key ในคอลัมน์ userID ของตาราง userImage ที่อ้างอิงคอลัมน์ userID ของตารางผู้ใช้ Collation จะต้องเหมือนกันนั่นคือutf8_general_ciและชุดอักขระutf8สำหรับทั้งสองคอลัมน์ของตาราง โดยทั่วไปเมื่อคุณสร้างตาราง mysql จะใช้การกำหนดค่าทั้งสองนี้จากการตั้งค่าเซิร์ฟเวอร์


ทำไมฉันไม่เห็นนักเขียนบทกวีนี้มาก่อน! ฉันใช้เวลาหนึ่งชั่วโมงเพื่อหาสาเหตุของปัญหา มันเป็นชุดอักขระในกรณีของฉัน ตารางอ้างอิงและตารางอ้างอิงต้องมีชุดอักขระเหมือนกัน
สุจิตจิต Joshi

2

โปรดตรวจสอบให้แน่ใจว่าทั้งคอลัมน์คีย์หลักและคอลัมน์ที่อ้างอิงของคุณมีประเภทข้อมูลและแอตทริบิวต์ที่เหมือนกัน (ไม่ระบุชื่อ, zerofill และไบนารีที่ไม่ได้ลงชื่อ)


2

กรณีขอบจริงคือที่ที่คุณใช้เครื่องมือ MySQL, (Sequel Pro ในกรณีของฉัน) เพื่อเปลี่ยนชื่อฐานข้อมูล จากนั้นสร้างฐานข้อมูลด้วยชื่อเดียวกัน

สิ่งนี้เก็บข้อ จำกัด foreign key ไว้ในชื่อฐานข้อมูลเดียวกันดังนั้นฐานข้อมูลที่เปลี่ยนชื่อ (เช่น my_db_renamed) มีข้อ จำกัด foreign key ในฐานข้อมูลที่สร้างขึ้นใหม่ (my_db)

ไม่แน่ใจว่านี่เป็นข้อผิดพลาดใน Sequel Pro หรือถ้ามีกรณีการใช้งานที่ต้องใช้พฤติกรรมนี้ แต่ฉันเสียค่าใช้จ่ายตอนเช้าที่ดีที่สุด: /


2

ฉันมีข้อผิดพลาดเดียวกัน ในกรณีของฉันเหตุผลของข้อผิดพลาดคือฉันมีคำสั่ง ON DELETE SET NULL ในข้อ จำกัด ในขณะที่ฟิลด์ที่ฉันใส่ข้อ จำกัด ในคำจำกัดความของมันมีคำสั่ง NOT NULL การอนุญาตให้ NULL ในฟิลด์สามารถแก้ไขปัญหาได้


2

ฉันประสบปัญหาประเภทนี้ในขณะที่สร้างฐานข้อมูลจาก textfile

mysql -uroot -padmin < E:\important\sampdb\createdb.sql
mysql -uroot -padmin sampdb < E:\important\sampdb\create_student.sql
mysql -uroot -padmin sampdb < E:\important\sampdb\create_absence.sql

mysql -uroot -padmin sampdb < E:\important\sampdb\insert_student.sql
mysql -uroot -padmin sampdb < E:\important\sampdb\insert_absence.sql

mysql -uroot -padmin sampdb < E:\important\sampdb\load_student.sql
mysql -uroot -padmin sampdb < E:\important\sampdb\load_absence.sql 

ฉันเพิ่งเขียนบรรทัดด้านบนค่ะ Create.batและเรียกใช้ไฟล์ค้างคาว

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

หากคุณสร้างตารางด้วย foreign key ให้ตรวจสอบว่ามีตารางอ้างอิงอยู่หรือไม่ และตรวจสอบชื่อของตารางอ้างอิงและเขตข้อมูล


กล่าวอีกนัยหนึ่งคุณพยายามสร้างตารางที่มีคีย์ต่างประเทศที่ชี้ไปยังตารางอื่นซึ่งยังไม่มีอยู่ สร้างตารางตามลำดับที่ถูกต้องเพื่อแก้ไขปัญหา
Vincent

2

ฉันมีปัญหาที่คล้ายกัน แต่ของฉันเป็นเพราะฉันกำลังเพิ่มเขตข้อมูลใหม่ไปยังตารางที่มีอยู่ที่มีข้อมูลและเขตข้อมูลใหม่ได้อ้างอิงเขตข้อมูลอื่นจากตารางผู้ปกครองและยังมีการกำหนดไม่เป็นโมฆะและไม่มีค่าเริ่มต้น - ฉันพบเหตุผลที่สิ่งต่าง ๆ ไม่ทำงานเป็นเพราะ

  1. ฟิลด์ใหม่ของฉันจำเป็นต้องป้อนข้อมูลในฟิลด์ว่างอัตโนมัติโดยมีค่าจากตารางหลักในแต่ละระเบียนก่อนที่จะสามารถใช้ข้อ จำกัด ได้ ทุกครั้งที่มีการนำข้อ จำกัด มาใช้จำเป็นต้องปล่อยให้ Integrity ของข้อมูลในตารางครบถ้วน การใช้ข้อ จำกัด (Foreign Key) แต่ก็มีบันทึกฐานข้อมูลบางอย่างที่ไม่มีค่าจากตารางหลักจะหมายถึงข้อมูลเสียหายดังนั้น MySQL จะไม่มีการบังคับใช้ข้อ จำกัด ของคุณ

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

วิธีที่ง่ายกว่าในการหลีกเลี่ยง gotcha นี้คือ

  • บันทึกข้อมูลตารางฐานข้อมูลของคุณ
  • ตัดข้อมูลตาราง (และสิ่งประดิษฐ์ของตารางเช่นดัชนี ฯลฯ )
  • ใช้ข้อ จำกัด
  • นำเข้าข้อมูลของคุณ

ฉันหวังว่านี่จะช่วยให้ใครบางคน


1

บางทีนี่อาจช่วยได้? คำจำกัดความของคอลัมน์คีย์หลักควรตรงกับคอลัมน์คีย์ต่างประเทศ


1

ตรวจสอบให้แน่ใจว่าตารางทั้งหมดสามารถรองรับ foreign key - เอ็นจิ้น InnoDB


1

คอลัมน์ของตาราง PARENT ที่คุณอ้างถึงจากตารางลูกต้องไม่ซ้ำกัน หากไม่ใช่ให้เกิดข้อผิดพลาดที่ 150


มันอาจจะคุ้มค่าที่คุณเพิ่มในรายละเอียดอีกเล็กน้อย - เช่นชื่อคอลัมน์และตารางที่เฉพาะเจาะจง
Jonathan

1

ฉันมีปัญหาที่คล้ายกันเมื่อทิ้งฐานข้อมูล Django mysql ด้วยตารางเดียว ฉันสามารถแก้ไขปัญหาได้โดยการทิ้งฐานข้อมูลไปยังไฟล์ข้อความย้ายตารางที่เป็นปัญหาไปยังจุดสิ้นสุดของไฟล์โดยใช้ emacs และนำเข้าไฟล์การถ่ายโอนข้อมูล sql ที่แก้ไขแล้วไปยังอินสแตนซ์ใหม่

ขอบคุณเรา


1

ฉันแก้ไขปัญหาโดยทำให้ตัวแปรยอมรับ null

ALTER TABLE `ajout_norme` 
CHANGE `type_norme_code` `type_norme_code` VARCHAR( 2 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL

1

ฉันพบปัญหาเดียวกันเมื่อรันชุดคำสั่ง MySQL ของฉันเกิดขึ้นระหว่างการสร้างตารางเมื่ออ้างอิงถึง foreign key ไปยังตารางอื่นซึ่งยังไม่ได้สร้าง มันคือลำดับของการมีอยู่ของตารางก่อนที่จะอ้างอิง

การแก้ปัญหา: สร้างตารางหลักก่อนที่จะสร้างตารางลูกที่มีคีย์ต่างประเทศ


1

สร้างตารางโดยไม่มีรหัสต่างประเทศจากนั้นตั้งค่ารหัสต่างประเทศแยกต่างหาก

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