Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Как добавить запись в таблицу, имеющую внешний ключ (http://forum.oszone.net/showthread.php?t=135839)

andrystepa 25-03-2009 16:54 1074487

Как добавить запись в таблицу, имеющую внешний ключ
 
База 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 1074930

Цитата:

Цитата andrystepa
Первый запрос прошел без проблем, а вот второй не удался »

Ну правильно. В первом случае вы вставляете записи, во втором обновляете существующие.

Что можно сделать:
Код:

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

andrystepa 26-03-2009 15:24 1075343

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

Delirium 27-03-2009 02:01 1075867

Всегда рады помочь :)


Время: 06:21.

Время: 06:21.
© OSzone.net 2001-