Ошибка при создании таблиц в MySQL

#mysql #sql

#mysql #sql

Вопрос:

Я пытаюсь запустить следующий SQL-скрипт:

 CREATE TABLE part
(Partno    CHAR(4) PRIMARY KEY,
 Partdesc  VARCHAR(20),
 Onhand    INTEGER,
 Partclass CHAR(2) check (Partclass IN ('AP','HW','KI','SP')),
 Unitprice DECIMAL(6,2)
);


CREATE TABLE salesrep
(Srepno     CHAR(3),
 Srepname   VARCHAR(25),
 Srepstreet VARCHAR(30),
 Srepcity   VARCHAR(15) NOT NULL,
 Srepprov   VARCHAR(3) NOT NULL,
 Sreppcode  VARCHAR(6) NOT NULL,
 Totcomm    DECIMAL(8,2),
 Commrate   DECIMAL(3,2),
 CONSTRAINT pkslsrep PRIMARY KEY (Srepno)
);


CREATE TABLE customer
(Custno     CHAR(3),
 Custname   VARCHAR(25) NOT NULL,
 Custstreet VARCHAR(30) NOT NULL,
 Custcity   VARCHAR(15) NOT NULL,
 Custprov   VARCHAR(3) NOT NULL,
 Custpcode  VARCHAR(6) NOT NULL,
 Disc       DECIMAL(3,1),
 Balance    DECIMAL(7,2),
 Credlimit  DECIMAL(5),
 Srepno     CHAR(3),
 CONSTRAINT pkcustno PRIMARY KEY (Custno),
 CONSTRAINT fksrepno FOREIGN KEY (Srepno) REFERENCES salesrep(Srepno)
);


CREATE TABLE orders
(Orderno   CHAR(5) UNIQUE NOT NULL,
 Orderdate DATE,
 Custno    CHAR(3) NOT NULL,
 CONSTRAINT fkordercust FOREIGN KEY (Custno) REFERENCES customer (Custno)
);


CREATE TABLE orderprod
(Orderno    CHAR(5),
 Partno     CHAR(4),
 Orderqty   INTEGER CHECK (Orderqty>0),
 Orderprice DECIMAL(7,2),
 CONSTRAINT pkorderprod PRIMARY KEY (Orderno, Partno),
 CONSTRAINT fkordprdord FOREIGN KEY (Orderno) REFERENCES orders(Orderno),
 CONSTRAINT fkordprdpar FOREIGN KEY (Partno) REFERENCES part(Partno)
);


CREATE TABLE invoice
( Invno     CHAR(6),
  Invdate   DATE,
  Orderno    CHAR(5),
  CONSTRAINT fkinvoice FOREIGN KEY (Orderno) REFERENCES orders(Orderno),
  CONSTRAINT pkinvoice PRIMARY KEY (Invno)
);


CREATE TABLE invprod
( Invno     CHAR(6),
  Partno     CHAR(4),
  Shipqty    INTEGER CHECK (Shipqty>0),
  CONSTRAINT fkinvoice FOREIGN KEY (Invno) REFERENCES invoice(Invno),
  CONSTRAINT fkpart FOREIGN KEY (Partno) REFERENCES part(Partno)
);

DROP TABLE invprod;
DROP TABLE invoice;
DROP TABLE orderprod;
DROP TABLE orders;
DROP TABLE customer;
DROP TABLE salesrep;
DROP TABLE part;*
  

Я не могу создать таблицу invprod. Я получаю сообщение об ошибке: 69 не удается создать таблицу ‘sh.invprod’ (ошибка: 121). Какие ошибки я допускаю в этом скрипте?

Комментарии:

1. Если вы выполните show innodb status , в середине вывода будет более подробный раздел «последняя ошибка», в котором должно быть лучшее объяснение того, почему вы не можете создать таблицу.

2. Какую версию MySQL вы используете? Я только что попробовал это на 5.1.57, и это сработало нормально

3. у меня ваш скрипт работает нормально, за исключением необходимости удалять ‘*’ в конце. Какую версию SQLite вы используете?

Ответ №1:

CONSTRAINT fkinvoice уже определено как часть CREATE TABLE invoice . Имена ограничений должны быть уникальными, как таблицы или индексы.

Комментарии:

1. -1: имена ключей указаны для каждой таблицы. наличие fkinvoice в одной таблице не мешает вам использовать то же имя ключа в другой таблице.

2. @Marc B: Если задано CONSTRAINT symbol предложение, symbol значение должно быть уникальным в базе данных. Обратитесь к: dev.mysql.com/doc/refman/5.0/en /…

3. Ну, разве это не просто замечательно. Oracle действительно должен упростить чтение этих документов. Если вы хотите внести какие-либо изменения в свой вопрос, я удалю отрицательный отзыв.

4. @Raihan Я только что изменил имя внешнего ключа, но теперь он не создает таблицы ..: (

5. @Raihan Это ничего не делает..:/