SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 19.04.2011 05:14:32

verybadbug
Участник
Зарегистрирован: 17.02.2010
Сообщений: 11

Удаление из нескольких таблиц

Есть таблицы

user
  user_id INTEGER
  user_login VARCHAR

group
  group_id INTEGER
  group_name VARCHAR

usergroup
  usergroup_id INTEGER
  usergroup_user_id INTEGER
  usergroup_group_id INTEGER

Хочу удалить пользователя (из user) и его связки с группами (из usergroup).

Пробую так DELETE `user`, `usergroup` FROM `user`, `usergroup` WHERE `usergroup_user_id`=`user_id` AND `user_id`='1'
не получается - не удаляет пользователя (может потому что для него связок нет).

Помогите составить правильный запрос.

Неактивен

 

#2 19.04.2011 08:06:29

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2420

Re: Удаление из нескольких таблиц

verybadbug написал:

Пробую так DELETE `user`, `usergroup` FROM `user`, `usergroup` WHERE `usergroup_user_id`=`user_id` AND `user_id`='1'
не получается - не удаляет пользователя (может потому что для него связок нет).

Так вроде вообще нельзя.
Можно в два запроса, например:

DELETE FROM `usergroup` WHERE `usergroup_user_id`=1;
DELETE FROM `user` WHERE `user_id`=1;

А вообще такие вещи лучше делать через on delete cascade.

Пример:

create table if not exists `t_4140_user`
(
`user_id` bigint unsigned not null auto_increment primary key,
`user_name` varchar(255) not null
) engine=InnoDB;
insert into `t_4140_user`(user_name) values ('Ivan'),('Petr'),('Sidor');

create table if not exists `t_4140_group`
(
`group_id` bigint unsigned not null auto_increment primary key,
`group_name` varchar(255) not null
) engine=InnoDB;
insert into `t_4140_group`(group_name) values ('group1');

create table if not exists `t_4140_usergroup`
(
`usergroup_id` bigint unsigned not null auto_increment primary key,
`usergroup_user_id` bigint unsigned,
`usergroup_group_id` bigint unsigned,
FOREIGN KEY (usergroup_user_id) REFERENCES `t_4140_user`(`user_id`) ON DELETE CASCADE,
FOREIGN KEY (usergroup_group_id) REFERENCES `t_4140_group`(`group_id`) ON DELETE CASCADE
) engine=InnoDB;
insert into t_4140_usergroup(`usergroup_user_id`,`usergroup_group_id`) values (1,1),(2,1),(3,1);
 


Таким образом при выполнении запроса 
delete from `t_4140_user` where user_id=1;
автоматически удалится соответствующая запись в таблице t_4140_usergroup, при удалении группы также удалятся соответствующие записи.

Отредактированно deadka (19.04.2011 08:08:23)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 19.04.2011 08:36:58

verybadbug
Участник
Зарегистрирован: 17.02.2010
Сообщений: 11

Re: Удаление из нескольких таблиц

спасибо за ответ... только пара вопросов появились
1. данную конструкцию (ON DELETE CASCADE) поддерживают только InnoDB-таблицы?
2. в какой версии MySQL появилась эта конструкция

Неактивен

 

#4 19.04.2011 13:47:15

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2420

Re: Удаление из нескольких таблиц

Судя по мануалу

Foreign keys definitions are subject to the following conditions:
         Both tables must be InnoDB tables and they must not be TEMPORARY tables.


Да, обе только InnoDB, не temporary таблички.

13.2.5.4. FOREIGN KEY Constraints
Starting from MySQL 3.23.44, InnoDB features foreign key constraints.


Возможность появилась начиная с 3.23.44, так что использовать можно смело smile.

Отредактированно deadka (19.04.2011 13:47:56)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 19.04.2011 15:22:20

avgsoft
Завсегдатай
Зарегистрирован: 23.09.2010
Сообщений: 36

Re: Удаление из нескольких таблиц

можно использовать LEFT JOIN для этого случая.

DELETE `user`, `usergroup` FROM `user`LEFT JOIN `usergroup` ON `usergroup_user_id`=`user_id` WHERE `user_id`='1'

это позволит удалять пользователей для которых не связей с группами.

Отредактированно avgsoft (19.04.2011 15:23:34)

Неактивен

 

#6 20.04.2011 06:32:05

verybadbug
Участник
Зарегистрирован: 17.02.2010
Сообщений: 11

Re: Удаление из нескольких таблиц

avgsoft то, что нужно!
даже не думал, что в DELETE можно использовать такую конструкцию...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson