Связь между полями в разных таблицах

Uko

Guest
Связь между полями в разных таблицах

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

alexhemp

Новичок
Uko

Ты не должен этого хотеть. Это явно неверно поставленная задача. Возможно ты не подозреваешь о наличии такой операции как JOIN
 

DiTHER

bang bang
alexhemp, спокойно :)

Uko, Юр, хеллоу.

REFERENCES в MySQL возможны только в таблицах INNODB (обещают реализовать их в MyISAM к 5.1 вроде)

[sql]CREATE TABLE id_asd (id integer PRIMARY KEY NOT NULL AUTO_INCREMENT, title text) ENGINE=innodb;

CREATE TABLE asd(id integer PRIMARY KEY NOT NULL AUTO_INCREMENT, title text, id_asd integer default NULL,
FOREIGN KEY (id_asd) REFERENCES id_asd (id) ON DELETE SET NULL ON UPDATE CASCADE) ENGINE=innodb;

INSERT INTO id_asd (title) VALUES ('title1'),('title2'),('title3');

INSERT INTO asd (title,id_asd) VALUES ('maintitle1',1),('maintitle2',2),('maintitle3',3),('maintitle4',2);

SELECT * FROM id_asd;[/sql]
Код:
+----+--------+
| id | title  |
+----+--------+
|  1 | title1 |
|  2 | title2 |
|  3 | title3 |
+----+--------+
3 rows in set (0.00 sec)
[sql]
SELECT * FROM asd;[/sql]
Код:
+----+------------+--------+
| id | title      | id_asd |
+----+------------+--------+
|  1 | maintitle1 |      1 |
|  2 | maintitle2 |      2 |
|  3 | maintitle3 |      3 |
|  4 | maintitle4 |      2 |
+----+------------+--------+
4 rows in set (0.00 sec)

т.е. таблицы связаны по полям asd.id_asd и id_asd.id

теперь попробуем поменять id в таблице id_asd. Ожидаемый результат - смена id_asd в нужном месте в таблице asd.

[sql]update id_asd set id = 10 where id = 2;

select * from id_asd[/sql]
Код:
+----+--------+
| id | title  |
+----+--------+
|  1 | title1 |
|  3 | title3 |
| 10 | title2 |
+----+--------+
3 rows in set (0.00 sec)
[sql]select * from asd[/sql]
Код:
+----+------------+--------+
| id | title      | id_asd |
+----+------------+--------+
|  1 | maintitle1 |      1 |
|  2 | maintitle2 |     10 |
|  3 | maintitle3 |      3 |
|  4 | maintitle4 |     10 |
+----+------------+--------+
4 rows in set (0.00 sec)
вуаля.

при удалении из таблицы id_asd - будет значение asd.id_asd ставится в NULL.

ON UPDATE - говорит о том чего творить со столбцом в дочерней таблице (asd) если он меняется в главной (id_asd). Например SET NULL, SET DEFAULT, CASCADE (каскадно удалять все связи). Тоже самое с ON DELETE - может быть например SET NULL, SET DEFAULT, CASCADE, RESTRICT (запрещать). См. мануал по этому поводу.

Несколько важных моментов :)
1. __никогда__ не меняй ID как показал я :) Поле ID вообще никогда меняться не должно - поменял только для примера. Эт на всякий случай... :)

2. Использовать связи, и как следствие, таблицы INNODB нужно только подумав перед этим несколько раз. Механизм предоставляемый связами в mysql легко симитировать (что собственно говоря почти все и делают). Однако это становится уже невыносимым если связи 4-5 порядка (4-5 лишних запросов в базу.. брр)
Иными словами, в большей части проектов это НЕ НУЖНО. (имхо, bsn в их ряды не входит :)))
 
Сверху