ErrorMsg при загрузке образца базы данных из "Learning SQL" О'Рейли Медиа - PullRequest
2 голосов
/ 08 мая 2011

Изучение SQL, второе издание

By Alan Beaulieu
Publisher: O'Reilly Media
Released: April 2009
ISBN: 9780596520830

В вышеприведенной книге есть код для создания базы данных MySQL, который они разместили здесь: http://examples.oreilly.com/9780596520847/LearningSQLExample.sql

Когда я запускаю код, все «кажется» нормальным, но только после того, как я удалю следующие строки кода:

/* recreate employee self-referencing foreign key */
alter table employee add constraint fk_e_emp_id
foreign key (superior_emp_id) references employee (emp_id);

Я считаю, что для меня ясно, что делает этот код, и что он был выполнен в инструкциях create table - и, похоже, никогда не отменялся (поэтому мне неясно, зачем нужен код, вызывающий ошибку); может быть неправильно в этом.

Вот сообщение об ошибке, которое я получаю для тех строк кода, которое одинаково, независимо от того, выполняется ли оно в коде, указанном выше, или в случае ниже, запускается после удаления его из предоставленного кода, запуская предоставленный код ( который создает базу данных), а затем запускает ее самостоятельно в созданной базе данных:

Enter password: **********************************************************
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 17
Server version: 5.1.53-community MySQL Community Server (GPL)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use bank
Database changed
mysql> alter table employee add constraint fk_e_emp_id
    -> foreign key (superior_emp_id) references employee (emp_id);
ERROR 1005 (HY000): Can't create table 'bank.#sql-80c_11' (errno: 121)
mysql>exit

UPDATE:

На всякий случай, если вам интересно, так как я нахожу код немного странным, инструкции книги по использованию кода, на который ссылаются, в основном:

create database bank;
use bank
source C:\LearningSQLExample.sql;

Ответы [ 3 ]

2 голосов
/ 08 мая 2011

Я не вижу причин для этого заявления.

Они используют временную таблицу, чтобы гарантировать, что в столбец superior_emp_id назначаются только действительные FK, поэтому я не могу представить необходимость отменить ограничение, а затем добавить его заново. Я предполагаю, что изначально у них был код, который должен был сделать это из-за способа заполнения таблицы сотрудников, но затем переставил код туда, где он сейчас находится. Эх, даже это объяснение может не иметь смысла.

В любом случае, небрежно из них не выполнить хотя бы простой прогон примера кода перед публикацией.

0 голосов
/ 22 июня 2016

Это июнь 2016 года, и я использую MySQL Community Server 5.7.13 на ПК с Win7

Сначала добавьте SET SQL_SAFE_UPDATES = 0;, как показано ниже

/* create data for self-referencing foreign key 'superior_emp_id' */

SET SQL_SAFE_UPDATES = 0;

создать временную таблицу

emp_tmp as select emp_id, fname, lname from employee;

и т. Д.

Во-вторых, удалите без знака из любого места, где оно встречается в коде.

Код работает как брелок в этих модах.*

0 голосов
/ 08 мая 2011

Удалите замедление без знака в таблице сотрудников для superior_emp_id и emp_id и повторите попытку.

При создании таблицы для сотрудника:

create table employee
(emp_id smallint unsigned not null auto_increment,
fname varchar(20) not null,
lname varchar(20) not null,
start_date date not null,
end_date date,
superior_emp_id smallint unsigned,
dept_id smallint unsigned,
title varchar(20),
assigned_branch_id smallint unsigned,
constraint fk_e_emp_id 
foreign key (superior_emp_id) references employee (emp_id),
constraint fk_dept_id
foreign key (dept_id) references department (dept_id),
constraint fk_e_branch_id
foreign key (assigned_branch_id) references branch (branch_id),
constraint pk_employee primary key (emp_id)
);

empid помечен как unsigned: emp_id smallint unsigned not null auto_increment Попробуйте удалить это unsigned.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...