2012-01-04 1 views
2

Это SQL для 2-х таблицON DELETE CASCADE не работает

CREATE TABLE Customer(
    c_id  INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    f_name  VARCHAR(50) NOT NULL, 
    l_name  VARCHAR(50) NOT NULL, 
    email  VARCHAR(100) NOT NULL, 
    number  INTEGER, 
    date_joined DATE NOT NULL CHECK (date_added <= now()) 
); 

CREATE TABLE Address(
    a_id  INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    c_id  INTEGER NOT NULL REFERENCES Customer(c_id) ON DELETE CASCADE, 
    billing  BOOLEAN, 
    f_line  VARCHAR(50) NOT NULL, 
    s_line  VARCHAR(100), 
    county  VARCHAR(20) NOT NULL, 
    p_code  VARCHAR(7) NOT NULL, 
    number  INTEGER(11) 
); 

Однако, когда я удалить клиента, их адреса не удаляются, какие-либо идеи, почему?

+5

Так что происходит? Это не удается? Он оставляет сиротскую запись? Что такое РСУБД? –

+2

Я бы предположил, что вы используете mysql, а двигатель по умолчанию - MyISAM, который не поддерживает внешние ключи. – a1ex07

+2

Кроме того, скрипт таблиц назад для проверки ограничения внешнего ключа существует и имеет каскадное удаление. – MatBailie

ответ

6

Не могу сказать наверняка, не зная, какой БД вы используете, но я думаю, что вы, вероятно, нужно объявить FK как ограничение, как это:

CREATE TABLE Address(
    a_id  INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    c_id  INTEGER NOT NULL, 
    billing  BOOLEAN, 
    f_line  VARCHAR(50) NOT NULL, 
    s_line  VARCHAR(100), 
    county  VARCHAR(20) NOT NULL, 
    p_code  VARCHAR(7) NOT NULL, 
    number  INTEGER(11), 
    FOREIGN KEY (c_id) REFERENCES Customer(c_id) ON DELETE CASCADE 
); 
+1

Хороший улов. MySQL игнорирует (без ошибок или предупреждения) определение «встроенного» внешнего ключа, как показано в вопросе (даже для InnoDB). –