#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 Это ничего не делает..:/