в MySQL, на каскаде удаления не работает - PullRequest
8 голосов
/ 06 сентября 2011

похоже на ON DELETE CASCADE не работает в MySQL , но что-то не так:

Способ ANSI

-- test delete cascade
CREATE TABLE t1(
    id SERIAL PRIMARY KEY,
    data TEXT
);

CREATE TABLE t2(
    id INT PRIMARY KEY REFERENCES t1(id) ON DELETE CASCADE,
    data2 TEXT
);

INSERT INTO t1 VALUES(1, 'one');
INSERT INTO t2 VALUES(1, 'first');

DELETE FROM t1;
SELECT * FROM t2; -- should have not rows - have one!

используйте это всевремя в postgres, но по какой-то причине не получается запустить его в mysql.

Я медленно учусь, есть ANSI-стандарт, postgreql, и есть MySQL.Каждый раз, когда я думаю, что я несколько оценил разницу, я не подходил близко.

MySQL Way

CREATE TABLE `t2` (
    `id` BIGINT(20) UNSIGNED NOT NULL,
    `data2` TEXT,
    PRIMARY KEY (`id`),
    CONSTRAINT `FK_t2_1` FOREIGN KEY (`id`) REFERENCES `t1` (`id`) ON DELETE CASCADE
) ENGINE = InnoDB DEFAULT CHARSET = latin1;

Для меня код, который я имею, является стандартным, имеет смысли (с точки зрения SQL) эстетически приятен, в то время как способ mysql (спасибо за помощь!) напоминает мне Visual Basic или что-то еще - это действительно безобразно, как грех, и imho неправильно просить умных людей унижать себянаписать такую ​​вещь.

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

Ответы [ 3 ]

6 голосов
/ 06 сентября 2011

Если вы создаете t2, как это, он работает нормально:

CREATE TABLE  `t2` (
  `id` bigint(20) unsigned NOT NULL,
  `data2` text,
  PRIMARY KEY (`id`),
  CONSTRAINT `FK_t2_1` FOREIGN KEY (`id`) REFERENCES `t1` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ETA, в ответ на опасения по поводу уродливого кода, также работает следующее:

CREATE TABLE  t2 (
  id bigint(20) unsigned NOT NULL PRIMARY KEY,
  data2 text,
  CONSTRAINT  FOREIGN KEY (id) REFERENCES t1(id) ON DELETE CASCADE
) ENGINE=InnoDB ;

Основное отличие заключается вчто тип данных для t2.id должен совпадать с типом данных t1.id, а ограничения должны быть объявлены после столбцов.

4 голосов
/ 06 сентября 2011

(при условии, что в таблице t2 должен быть «внешний ключ», а не «первичный ключ»)

MySQL просто игнорирует все встроенные ограничения внешнего ключа без предупреждения.

Для этого вам нужно явно добавить иностранный, как показано dnagirl

3 голосов
/ 17 января 2017

Установите foreign_key_checks равным 1, я столкнулся с этой проблемой при экспорте и импорте данных, во время которых было установлено значение 0

/ *! 40014 SET @OLD_FOREIGN_KEY_CHECKS = @@ FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS =1 * /;

...