2013-04-09 91 views
0

我不被允許創建下表。是因爲複合主鍵嗎?我還爲用戶和標題表添加了信息,以防代碼中存在問題。無法創建SQL表 - 定義了錯誤1005

CREATE TABLE store 
(
    short_name VARCHAR(5)      NOT NULL, 
    name  VARCHAR(30)      NOT NULL, 
    address1 VARCHAR(50)      NOT NULL, 
    address2 VARCHAR(20), 
    city  VARCHAR(30)      NOT NULL, 
    state  VARCHAR(30)      NOT NULL, 
    zip   VARCHAR(10)      NOT NULL, 
    phone  VARCHAR(15)      NOT NULL, 
    CONSTRAINT store_pk PRIMARY KEY (short_name) 
); 

CREATE TABLE publishers 
(
    name  VARCHAR(50)       NOT NULL, 
    status  TINYINT   DEFAULT 1   NOT NULL, 
    CONSTRAINT publishers_pk PRIMARY KEY (name) 
); 
CREATE TABLE users 
(
    id   INT      NOT NULL AUTO_INCREMENT, 
    name  VARCHAR(70)      NOT NULL, 
    password VARCHAR(60),   
    address1 VARCHAR(50)      NOT NULL, 
    address2 VARCHAR(20), 
    city  VARCHAR(30)      NOT NULL, 
    state  VARCHAR(30)      NOT NULL, 
    zip   VARCHAR(10)      NOT NULL, 
    phone  VARCHAR(15), 
    email  VARCHAR(90), 
    store  VARCHAR(5), 
    admin  TINYINT    DEFAULT 0 NOT NULL, 
    mail_list TINYINT    DEFAULT 0 NOT NULL, 
    active  TINYINT    DEFAULT 0 NOT NULL, 
    CONSTRAINT users_pk PRIMARY KEY (id), 
    CONSTRAINT users_fk FOREIGN KEY (store) 
     REFERENCES store (short_name) 
     ON DELETE SET NULL 
     ON UPDATE CASCADE 
); 

CREATE TABLE titles 
(
    id   INT     NOT NULL AUTO_INCREMENT, 
    publisher VARCHAR(50), 
    title  VARCHAR(50)   NOT NULL, 
    status  ENUM('active', 'announced', 'inactive'), 
    discount TINYINT    NOT NULL, 
    CONSTRAINT title_pk PRIMARY KEY (id), 
    CONSTRAINT title_fk FOREIGN KEY (publisher) 
     REFERENCES publishers (name) 
     ON DELETE SET NULL 
     ON UPDATE CASCADE 
); 

CREATE TABLE subscriptions 
(
    user  INT, 
    title  INT, 
    quantity TINYINT    DEFAULT 1   NOT NULL, 
    CONSTRAINT subscription_pk PRIMARY KEY (user, title), 
    CONSTRAINT subscription_user_fk FOREIGN KEY (user) 
     REFERENCES users (id) 
     ON DELETE SET NULL 
     ON UPDATE CASCADE, 
    CONSTRAINT subscription_title_fk FOREIGN KEY (title) 
     REFERENCES titles (id) 
     ON DELETE SET NULL 
     ON UPDATE CASCADE 
); 
+0

給出'用戶名'和'標題'表的詳細信息 – Hoody 2013-04-09 21:02:13

+0

通過輸入'SHOW ENGINE INNODB STATUS;'可以獲得有關該錯誤的更多信息。 – decden 2013-04-09 21:03:50

+0

我已經更新了其他表格的信息。 – JimRomeFan 2013-04-09 21:04:44

回答

2

使用表定義,只有subscriptions表給出了一個問題,這是因爲ON DELETE SET NULL子句。 subscriptions表中的usertitle列定義爲NOT NULL

+0

我拿走了那些,他們仍然給我一個錯誤。 – JimRomeFan 2013-04-09 21:33:06

+0

@JimRomeFan試試這個SQL小提琴。這是你的DDL刪除ON DELETE SET NULL,它的工作原理:http://sqlfiddle.com/#!2/dedec – 2013-04-09 21:35:16

+0

好吧,我明白我必須做什麼。我不得不刪除ON DELETE SET NULL子句。謝謝。 – JimRomeFan 2013-04-09 21:39:15

0

主鍵被定義爲錯誤。 constraint title_pk primary key (id)和那些都是錯誤的。他們應該像primary key(id)

+0

咦?你在說括號之間的空格嗎?這不是錯誤。 – JimRomeFan 2013-04-09 21:07:57

+0

沒有即時通訊談論刪除像'約束title_pk'這樣的話 – 2013-04-09 21:09:29

+0

這不是問題所在。 – JimRomeFan 2013-04-09 21:10:23

0

它可能會失敗的外鍵約束。

運行以下命令:

SHOW ENGINE INNODB STATUS\G 

,並期待 「國外最新鍵錯誤」 一節。這應該告訴你這個問題。

如果還不存在的用戶和/或標題表,應在創建表之前運行此:

set foreign_key_checks = 0; 

如果不存在這些表,它可能是數據類型不匹配在父列(即user.id)和子列(即用戶)之間。

+0

如何運行\ G命令?我正在使用mysql工作臺或phpmyadmin。 – JimRomeFan 2013-04-09 21:12:51

+0

@JimRomeFan'\ G'特定於mysql客戶端。它告訴客戶端垂直顯示結果。在你的客戶端你可以跳過:'SHOW ENGINE INNODB STATUS' – 2013-04-09 21:17:39

+0

它沒有產生任何東西。我導出了結果,它是空白的。 – JimRomeFan 2013-04-09 21:21:57

相關問題