سؤال

أحاول إنشاء مفتاح خارجي على عمودين من جدول للإشارة إلى نفس العمود في جدول آخر، ولكن يبدو أنني أتلقى خطأً...

وإليك ما أفعله:

CREATE TABLE test2 (
  ID INT NOT NULL AUTO_INCREMENT,  
  col1 INT NOT NULL,
  col2 INT NOT NULL, 
  PRIMARY KEY (ID),
  CONSTRAINT fk FOREIGN KEY (col1, col2)
                REFERENCES test1(ID, ID)
  ON UPDATE CASCADE
  ON DELETE RESTRICT
) ENGINE=InnoDB;

لكنني فهمت

ERROR 1005 (HY000): Can't create table 'DB.test2' (errno: 150)

ومع ذلك، إذا كان لدي عمود واحد فقط، فسيتم إنشاء الجدول بشكل صحيح.

هل يمكن لأحد أن يشير لي أين الخطأ؟

شكرا ن

هل كانت مفيدة؟

المحلول

حاولت هنا وحصلت على نفس الخطأ.هذا يعمل على الرغم من:

CREATE TABLE test2 (
  ID INT NOT NULL AUTO_INCREMENT,  
  col1 INT NOT NULL,
  col2 INT NOT NULL, 
  PRIMARY KEY (ID),
  CONSTRAINT fk FOREIGN KEY (col1)
                REFERENCES test1(ID)
  ON UPDATE CASCADE
  ON DELETE RESTRICT,
  CONSTRAINT fk2 FOREIGN KEY (col2)
                REFERENCES test1(ID)
  ON UPDATE CASCADE
  ON DELETE RESTRICT

) ENGINE=InnoDB

نعم، أنا أعلم - السيناريو الخاص بك يجب العمل (حتى لو لم يكن الأمر منطقيًا).ومع ذلك، أعتقد أن هذا الإصدار الجديد هو أفضل.

نصائح أخرى

يبدو أن المشكلة هي أنك تحدد نفس العمود الأصلي مرتين في نفس المفتاح الخارجي (أي (ID، ID)).يجب أن يعمل ما يلي:

Create Table Test1
    (
    PK1 int not null
    , PK2 int not null
    , Primary Key ( PK1, PK2 )
    )

Create Table Test2
    (
    Id int not null Auto_Increment
    , PK1 int not null
    , PK2 int not null
    , Primary Key ( ID )
    , Constraint FK_Test2
        Foreign Key ( PK1, PK2 )
        References Test1( PK1, PK2 )
    )

إذا كان الأمر كذلك، فأنت تريد عمودين في جدول فرعي يشيران إلى نفس عمود الجدول الأصلي، فيجب عليك إضافة مرجعين للمفتاح الخارجي كما هو موضح بواسطة rsenna حيث يمثلان علاقتين مستقلتين.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top