سؤال

ولدي النصي التالي لإنشاء جدول في الخلية الإصدار 5.1 وهو للإشارة إلى 3 جداول أخرى. تم إنشاء جميع الجداول 3 باستخدام ك InnoDB، وجميع الجداول 3 يكون العمود ID تعرف بأنها INT.

ولقد خلق الجداول الأخرى بنجاح والتي ترجع ACCOUNT والشخص، ولكن هذا هو الجدول الأول الذي يحيل العنوان، لذلك لقد تضمنت تعريف لهذا الجدول، والمدى، وأقل أيضا.

والخطأ الذي انني اتلقى هو خطأ 1005 (HY000) مع errno 150، الذي أفهم أن تتعلق بإنشاء مفتاح خارجي.

والسيناريو الذي فشل هو (أعمدة إضافية إزالة البساطة):

CREATE TABLE WORK_ORDER (
    ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ACCOUNT_ID INT NOT NULL,
    CUSTOMER_ID INT NOT NULL,
    SALES_ID INT,
    TRADES_ID INT,
    LOCATION_ID INT NOT NULL,
    INDEX CUST_INDEX(CUSTOMER_ID),
    INDEX SALES_INDEX(SALES_ID),
    INDEX TRADES_INDEX(TRADES_ID),
    INDEX ACCOUNT_INDEX(ACCOUNT_ID),
    INDEX LOCATION_INDEX(LOCATION_ID),
    FOREIGN KEY (CUSTOMER_ID) REFERENCES PERSON(ID) ON DELETE CASCADE,
    FOREIGN KEY (SALES_ID) REFERENCES PERSON(ID) ON DELETE SET NULL,
    FOREIGN KEY (TRADES_ID) REFERENCES PERSON(ID) ON DELETE SET NULL,
    FOREIGN KEY (ACCOUNT_ID) REFERENCES ACCOUNT(ID) ON DELETE CASCADE,
    FOREIGN KEY (LOCATION_ID) REFERENCES ADDRESS(ID) ON DELETE SET NULL
) ENGINE=InnoDB;

والبيان SQL المستخدمة في إنشاء الجدول عنوان أقل من (أعمدة إضافية إزالة البساطة).

CREATE TABLE ADDRESS (
    ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    PERSON_ID INT NOT NULL,
    ACCOUNT_ID INT NOT NULL,
    ADDRESS_L1 VARCHAR(50),
    ADDRESS_L2 VARCHAR(50),
    CITY VARCHAR(25),
    PROVINCE VARCHAR(20),
    POSTAL_CODE VARCHAR(6),
    COUNTRY VARCHAR(25),
    INDEX CUST_INDEX(PERSON_ID),
    INDEX ACCOUNT_INDEX(ACCOUNT_ID),
    FOREIGN KEY (ACCOUNT_ID) REFERENCES ACCOUNT(ID) ON DELETE CASCADE,
    FOREIGN KEY (PERSON_ID) REFERENCES PERSON(ID) ON DELETE CASCADE
) ENGINE=InnoDB;

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

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

المحلول

ويمكنك دائما إصدار أمر ل'عرض ENGINE ك InnoDB الوضع ". دفن في الإخراج سيكون قسم "آخر الأخبار الأجنبي KEY خطأ"، والتي سيكون لها مزيد من التفاصيل حول بالضبط ما تسبب في '150' خطأ:

mysql> create table a (x int not null) type=innodb;
Query OK, 0 rows affected, 1 warning (0.02 sec)

mysql> create table b (y int not null, foreign key (y) references a (x) on delete set null) type=innodb;
ERROR 1005 (HY000): Can't create table './test/b.frm' (errno: 150)

mysql> show engine innodb status;
[..... snip snip snip ...]
------------------------
LATEST FOREIGN KEY ERROR
------------------------
091129 16:32:41 Error in foreign key constraint of table test/b:
foreign key (y) references a (x) on delete set null) type=innodb:
You have defined a SET NULL condition though some of the
columns are defined as NOT NULL.
[.... snip snip snip ...]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top