Войти

Показать полную графическую версию : Как добавить запись в таблицу, имеющую внешний ключ


andrystepa
25-03-2009, 16:54
База MySQL. Есть таблица отделов Units со столбцами: Unit_Id, Unit_Name. Unit_Id - Primary key. Далее есть таблица сотрудников Users со столбцами User_Id, User_name, Unit_Id. User_Id - Primary key а Unit_Id естественно внешний ключ. Таблица отделось Units заполнена, а таблицу сотрудников надо будет заполнять (или добавлять/удалять) начальникам отделов. Начальник отдела знает только название своего отдела а идентификатор, естественно не знает. Как составить запрос на вставку (или удаление) сотрудника, чтобы идентификатор отдела был взят из таблицы отделов по его названию?
И, кроме того, как все это сделать с помощью пакетной вставки - сотрудников много.
Более точное описание таблиц такое:
Units

mysql> DESCRIBE Units;
+-----------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+----------------------+------+-----+---------+----------------+
| Unit_Id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| unit_name | varchar(30) | YES | UNI | NULL | |
+-----------+----------------------+------+-----+---------+----------------+

А таблица Users:


mysql> DESCRIBE Users;
+-----------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+----------------------+------+-----+---------+----------------+
| User_Id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| User_name | varchar(31) | NO | UNI | | |
| Unit_Id | smallint(5) unsigned | YES | MUL | NULL | |
+-----------+----------------------+------+-----+---------+----------------+


Пробовал такой метод вставки:

Imysql> INSERT INTO Users(User_name) VALUES( 'Иванов И.' );
Query OK, 1 row affected (0.00 sec)

mysql> UPDATE Users SET Unit_id = (SELECT Unit_id FROM Units WHERE unit_name = 'Отдел Систем Управления') WHERE Unit_Id = 0;
Query OK, 0 rows affected (0.00 sec)


Первый запрос прошел без проблем, а вот второй не удался. Даже если вместо вложенного запроса вставить реальную цифру из таблицы Units, все равно ответ тот же.
Как все-таки вставить эти записи? Хотя бы без пакетной вставки!

Delirium
26-03-2009, 01:43
Первый запрос прошел без проблем, а вот второй не удался »
Ну правильно. В первом случае вы вставляете записи, во втором обновляете существующие.

Что можно сделать:
insert into USERS(user_name, unit_id) (select 'Иванов И.', unit_id from Units where unit_name='Отдел Систем Управления')

andrystepa
26-03-2009, 15:24
Спасибо, разобрался. В моем втором запросе вместо WHERE Unit_Id = 0 надо было ставить WHERE Unit_Id IS NULL; так как NULL и 0 не одно и то же. Впрочем Delirium, - Ваш вариант получше будет - все-таки один запрос.

Delirium
27-03-2009, 02:01
Всегда рады помочь :)




© OSzone.net 2001-2012