2013-04-09 2 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

подробно описать таблицы 'users' &' titles' – Hoody

+0

Вы можете получить дополнительную информацию об ошибке, набрав 'SHOW ENGINE INNODB STATUS',' обычно. – decden

+0

Я обновил информацию с помощью других таблиц. – JimRomeFan

ответ

2

Использование определений таблиц привело к возникновению проблемы только в таблице subscriptions, и это связано с предложением ON DELETE SET NULL. Столы user и title в таблице subscriptions определены как NOT NULL!

+0

Я вынул их, и они до сих пор дают мне ошибку. – JimRomeFan

+0

@JimRomeFan попробуйте этот скрипт SQL. Это ваш DDL с удаленным «ON DELETE SET NULL», и он работает: http://sqlfiddle.com/#!2/dedec –

+0

Хорошо, я вижу, что я должен был сделать. Мне пришлось удалить предложение ON DELETE SET NULL. Спасибо. – JimRomeFan

0

Ключи primay определены неправильно. constraint title_pk primary key (id) и те, кто ошибается. они должны быть похожими на primary key(id)

+0

А? Вы говорите о пространстве между круглыми скобками? Это не ошибка. – JimRomeFan

+0

no im говорит об удалении слов типа 'constraint title_pk' –

+0

Это не проблема. – JimRomeFan

0

Возможно, это связано с ограничениями внешнего ключа.

Выполнить это:

SHOW ENGINE INNODB STATUS\G 

И посмотрите раздел "ПОСЛЕДНЕЙ FOREIGN KEY ERROR". Это должно сказать вам о проблеме.

Если пользователи и/или название таблица еще не существует, вы должны запустить перед созданием таблиц:

set foreign_key_checks = 0; 

Если эти таблицы действительно существуют, то возможно, что типы данных не совпадают между родительскими столбцами (т.е. user.id) и дочерними столбцами (т.е. пользователем).

+0

Как запустить команду \ G? Я использую mysql workbench или phpmyadmin. – JimRomeFan

+0

@JimRomeFan '\ G' специфичен для клиента mysql. Он сообщает клиенту отображать результаты по вертикали. В вашем клиенте вы можете пропустить это: 'SHOW ENGINE INNODB STATUS' –

+0

Это ничего не производило. Я экспортировал результаты, и он был пустым. – JimRomeFan

Смежные вопросы