[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Удалить сразу из двух таблиц
maximka787
Ребят, подскажите, как удалить данные одним запросом из 2х таблиц (MyISAM)
id_project, username, passwd;
id_work, id_project, project_name; // id_project – ключ связывающий две таблицы

первая таблица проекты, вторая задания для них. Соответственно если мы удаляем проект то и задания тоже удаляются. Я делал раньше двумя запросами, но это не так надо.

К томуже, если делать отдельными запросами, то какой толк от связей таблиц вообще, кроме как «в уме» их связать.



Спустя 28 минут, 36 секунд (17.12.2010 - 11:54) SlavaFr написал(а):

Спустя 1 минута, 32 секунды (17.12.2010 - 11:55) maximka787 написал(а):
Цитата (SlavaFr @ 17.12.2010 - 08:54)
mysql on delete cascade

???? не понял. mysql on delete cascade вроде применяется к InnoDB

Спустя 1 минута, 2 секунды (17.12.2010 - 11:56) SlavaFr написал(а):
да к InnoDB. В противном случае одним запросом не получится.

Спустя 2 минуты (17.12.2010 - 11:58) maximka787 написал(а):
Ок пасибо, а InnoDB чаще применяется в сложных проектах?

Спустя 1 час, 21 секунда (17.12.2010 - 12:59) maximka787 написал(а):
Уперся в одну проблему.

CREATE TABLE myproject1(
id int not null auto_increment,
name text,
PRIMARY KEY (id)
)
TYPE=INNODB;
//
Тут все нормально создается


CREATE TABLE myproject2(
id int not null auto_increment,
data_create datetime,
name char(80), //почему если это поле имеет тип text все норм, если char и varchar то первичными ключами становятся все поля ??
PRIMARY KEY (id)
)
TYPE=INNODB;


Так же не должно быть?

Спустя 3 минуты, 23 секунды (17.12.2010 - 13:02) waldicom написал(а):
Цитата (SlavaFr @ 17.12.2010 - 10:56)
да к InnoDB. В противном случае одним запросом не получится.

как это не получится? А JOIN в DELETE уже отменили чтоли?

Спустя 12 минут, 13 секунд (17.12.2010 - 13:14) maximka787 написал(а):
А вот теперь уже я запутался) INNODB как-то интересней работает чем MyISAM, во всяком случае, он делает уже автоматом операции, а это уже упрощает запросы.

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

Спустя 47 минут, 50 секунд (17.12.2010 - 14:02) SlavaFr написал(а):
Цитата (waldicom @ 17.12.2010 - 10:02)
Цитата (SlavaFr @ 17.12.2010 - 10:56)
да к  InnoDB. В противном случае одним запросом не получится.

как это не получится? А JOIN в DELETE уже отменили чтоли?

чето меня действительно перемкнуло, надо больше спать.
да можно именно так как waldicom написал зделать.

таком образом:
delete t1,t2 from tabliza1 as t1 inner join tabliza2 as t2 on t1.joinpole=t2.joinpole where uslovie


Спустя 1 минута, 1 секунда (17.12.2010 - 14:03) maximka787 написал(а):
Мужики, помогите решить проблему.
CREATE TABLE project(
id int not null auto_increment primary key,
name varchar(50),
)
TYPE=INNODB AUTO_INCREMENT=1;

CREATE TABLE work(
id_plan_work int auto_increment, //auto_increment выдает ошибку
id_project int,
name text,
FOREIGN KEY (id_project) REFERENCES project(id)
ON DELETE CASCADE
) TYPE=INNODB AUTO_INCREMENT=1;

//auto_increment выдает ошибку
#1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key

а мне надо чтобы id_plan_work имел ID, а без auto_increment поле остается пустое.

Спустя 22 минуты, 28 секунд (17.12.2010 - 14:26) SlavaFr написал(а):
CREATE TABLE project(
id int not null auto_increment primary key,
name varchar(50)
)
TYPE=INNODB;


CREATE TABLE work(
id_plan_work int auto_increment primary key,
id_project int,
name text
) TYPE=INNODB;

alter table work add FOREIGN KEY (id_project) REFERENCES project(id) ON DELETE CASCADE;

#test

insert into project(name)values('test');
insert into work(id_project,name) values(1,'work from test');

delete from project where id=1;


select * from work; #должен также стереть work






но в принципе можеш и так стереть как

Спустя 11 минут, 27 секунд (17.12.2010 - 14:37) maximka787 написал(а):
Цитата (SlavaFr @ 17.12.2010 - 11:02)
таком образом:
delete t1,t2 from tabliza1 as t1 inner join tabliza2 as t2 on t1.joinpole=t2.joinpole where uslovie

А как применить к моим таблицам?
Таблица project (id_project, username);
Таблица work (id_work, id_project, name); // id_project – ключ связывающий две таблицы
delete * from project as t1 inner join work as t2 on t1.joinpole=t2.joinpole where id=1;

Спустя 3 минуты, 25 секунд (17.12.2010 - 14:41) maximka787 написал(а):
Цитата (SlavaFr @ 17.12.2010 - 11:26)
но в принципе можеш и так стереть как

отличный пример, а почему сразу не дает 2 авто инкремента сделать? это обман базы что ли? smile.gif Ведь такого не должно быть

Спустя 1 час, 22 минуты, 55 секунд (17.12.2010 - 16:04) SlavaFr написал(а):
Цитата (maximka787 @ 17.12.2010 - 11:37)
А как применить к моим таблицам?

delete p,w from project as p inner join work as w on w.id_project=p.id_project where p.id_project=1
Цитата (maximka787 @ 17.12.2010 - 11:41)
отличный пример, а почему сразу не дает 2 авто инкремента сделать? это обман базы что ли? smile.gif Ведь такого не должно быть

в одной таблице может быть только один автоинкремент.


_____________
..Работает - не трогай!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.