MySQL Workbench и внешние ключи - не счастливый брак - PullRequest
0 голосов
/ 03 декабря 2011

MySQL Workbench не позволяет мне устанавливать внешний ключ.Я использую движок базы данных INNO-DB.

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

Но,Независимо от того, какие настройки я пробую, я не могу получить внешний ключ.Это всегда дает мне ошибки при запуске SQL.Я задаюсь вопросом, не слишком ли усердствует ли это Workbench или я что-то упустил.

Есть ли учебник вокруг, который показывает, как это сделать?Информация MySQL очень мрачна и предполагает, что все будет работать.Или, может быть, кто-то заинтересовался бы быстрой консультационной работой, чтобы помочь мне настроить это?

1 Ответ

0 голосов
/ 03 декабря 2011

Я заставил это работать в MySQL 5.0.Вот как:

Выполните некоторые настройки - создайте базу данных и пользователя;Разрешения пользователя GRANT:

mysql -h localhost -u root -p
create database foreign_demo;
create user foreign_demo identified by 'foreign_demo';
grant all on foreign_demo.* to 'foreign_demo'@'%';
grant all on foreign_demo.* to 'foreign_demo'@'localhost';

Теперь создайте две простые таблицы: t1 (родительская) и t2 (дочерняя):

CREATE TABLE IF NOT EXISTS t1
(
    t1_id integer not null auto_increment,
    primary key(t1_id)
);

CREATE TABLE IF NOT EXISTS t2
(
    t2_id integer not null auto_increment,
    t1_id integer,
    primary key(t1_id),
    constraint fk_t1 foreign key(t2_id) references t1(t1_id) on delete cascade on update cascade
);

Теперь давайте вставим строку в каждую:

INSERT INTO t1 values();
INSERT INTO t2(t1_id) SELECT last_insert_id();

Давайте выберем то, что только что вставили:

select * from t1;
select * from t2;

Вы должны увидеть одну строку в каждой таблице;таблица t2 будет ссылаться на t1.

Теперь удалите родительскую запись:

delete from t1 where t1_id = 1;

Когда вы выполните эти выборки, вы не найдете строк ни в одной из таблиц, поскольку удалениеродительский каскад удаляется в дочерней таблице:

select * from t1;
select * from t2;

Лучше?

...