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 в их ряды не входит
))