第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

MySQL外鍵約束,級聯刪除

MySQL外鍵約束,級聯刪除

守著星空守著你 2019-06-28 16:17:27
MySQL外鍵約束,級聯刪除我想使用外鍵來保持完整性和避免孤兒(我已經使用了InnoDB)。如何在級聯上創(chuàng)建刪除的SQL語句?如果我刪除一個類別,那么如何確保它不會刪除與其他類別也相關的產品。Pivot表“類別_產品”在另外兩個表之間創(chuàng)建了一個多到多的關系。categories- id (INT)- name (VARCHAR 255)products- id- name- price categories_products- categories_id- products_id
查看完整描述

3 回答

?
慕田峪9158850

TA貢獻1794條經驗 獲得超7個贊

如果您的級聯刪除一個產品,因為它是一個類別的成員被殺死,那么你設置你的外鍵不當。給定示例表,您應該設置了以下表:

CREATE TABLE categories (
    id int unsigned not null primary key,
    name VARCHAR(255) default null)Engine=InnoDB;CREATE TABLE products (
    id int unsigned not null primary key,
    name VARCHAR(255) default null)Engine=InnoDB;CREATE TABLE categories_products (
    category_id int unsigned not null,
    product_id int unsigned not null,
    PRIMARY KEY (category_id, product_id),
    KEY pkey (product_id),
    FOREIGN KEY (category_id) REFERENCES categories (id)
       ON DELETE CASCADE
       ON UPDATE CASCADE,
    FOREIGN KEY (product_id) REFERENCES products (id)
       ON DELETE CASCADE
       ON UPDATE CASCADE)Engine=InnoDB;

通過這種方式,您可以刪除產品或類別,并且只有類別_Products中的相關記錄才會同時消亡。級聯將不會沿著樹的更遠的方向移動,也不會刪除父產品/類別表。

G.

products: boots, mittens, hats, coats
categories: red, green, blue, white, black

prod/cats: red boots, green mittens, red coats, black hats

如果刪除“紅色”類別,那么只有“類別”表中的“紅色”條目死亡,以及兩個條目“紅色靴子”和“紅色外套”。

刪除將不再級聯,也不會刪除‘靴子’和‘外套’類別。

評論后續(xù)行動:

你還是誤解了級聯刪除的工作原理。它們只影響定義“ON DELETE級聯”的表。在本例中,級聯是在“類別_產品”表中設置的。如果刪除“紅色”類別,那么在類別_Products中唯一會級聯刪除的記錄是category_id = red..它不會觸及‘分類_id=藍色’的任何記錄,也不會繼續(xù)到“Products”表,因為該表中沒有外鍵定義。

下面是一個更具體的例子:

categories:     products:+----+------+   +----+---------+| id | name |   | id | name    |+----+------+   +----+---------+| 1  | red  |   | 1  | mittens || 2  | blue |   | 2  | boots   |+---++------+   +----+---------+products_categories:+------------+-------------+| product_id | category_id |+------------+-------------+| 1          | 1           | // red mittens| 1          | 2           | // blue mittens| 2          | 1           | // red boots| 2          | 2           | // blue boots+------------+-------------+

假設您刪除了類別2(藍色):

DELETE FROM categories WHERE (id = 2);

DBMS將查看所有具有指向“類別”表的外鍵的表,并刪除匹配id為2的記錄。products_categories,刪除完成后,您將得到此表:

+------------+-------------+| product_id | category_id |+------------+-------------+| 1          | 1           | // red mittens| 2          | 1           | // red boots+------------+-------------+

中沒有定義外鍵。products表,因此級聯將不能在那里工作,所以您仍然有靴子和手套列出。再也沒有“藍色靴子”和“藍色手套”了。


查看完整回答
反對 回復 2019-06-28
?
30秒到達戰(zhàn)場

TA貢獻1828條經驗 獲得超6個贊

我被這個問題的答案弄糊涂了,所以我在MySQL中創(chuàng)建了一個測試用例,希望這會有所幫助。

-- SchemaCREATE TABLE T1 (
    `ID` int not null auto_increment,
    `Label` varchar(50),
    primary key (`ID`));CREATE TABLE T2 (
    `ID` int not null auto_increment,
    `Label` varchar(50),
    primary key (`ID`));CREATE TABLE TT (
    `IDT1` int not null,
    `IDT2` int not null,
    primary key (`IDT1`,`IDT2`));ALTER TABLE `TT`
    ADD CONSTRAINT `fk_tt_t1` FOREIGN KEY (`IDT1`) REFERENCES `T1`(`ID`) ON DELETE CASCADE,
    ADD CONSTRAINT `fk_tt_t2` FOREIGN KEY (`IDT2`) REFERENCES `T2`(`ID`) ON DELETE CASCADE;-- DataINSERT INTO `T1` (`Label`) VALUES ('T1V1'),('T1V2'),('T1V3'),('T1V4');INSERT INTO `T2` (`Label`) VALUES ('T2V1'),('T2V2'),('T2V3'),('T2V4');INSERT INTO `TT` (`IDT1`,`IDT2`) VALUES(1,1),(1,2),(1,3),(1,4),(2,1),(2,2),(2,3),(2,4),(3,1),(3,2),(3,3),(3,4),(4,1),(4,2),(4,3),(4,4);-- DeleteDELETE FROM `T2` WHERE `ID`=4; -- Delete one field, all the associated fields on tt, will be deleted, no change in T1TRUNCATE `T2`; -- Can't truncate a table with a referenced fieldDELETE FROM `T2`; -- This will do the job, delete all fields from T2, and all associations from TT, no change in T1


查看完整回答
反對 回復 2019-06-28
?
人到中年有點甜

TA貢獻1895條經驗 獲得超7個贊

我認為(我不確定)外鍵約束不能精確地滿足您的表設計要求。也許最好的做法是定義一個存儲過程,該存儲過程將以您想要的方式刪除某個類別,然后在您想要刪除某個類別時調用該過程。

CREATE PROCEDURE `DeleteCategory` (IN category_ID INT)LANGUAGE SQLNOT DETERMINISTIC
MODIFIES SQL DATA
SQL SECURITY DEFINERBEGINDELETE FROM
    `products`WHERE
    `id` IN (
        SELECT `products_id`
        FROM `categories_products`
        WHERE `categories_id` = category_ID    );DELETE FROM `categories`WHERE `id` = category_ID;END

還需要將下列外鍵約束添加到鏈接表中:

ALTER TABLE `categories_products` ADD
    CONSTRAINT `Constr_categoriesproducts_categories_fk`
    FOREIGN KEY `categories_fk` (`categories_id`) REFERENCES `categories` (`id`)
    ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT `Constr_categoriesproducts_products_fk`
    FOREIGN KEY `products_fk` (`products_id`) REFERENCES `products` (`id`)
    ON DELETE CASCADE ON UPDATE CASCADE

約束子句當然也可以出現在CREATETABLE語句中。

創(chuàng)建了這些模式對象之后,可以刪除一個類別,并通過發(fā)出CALL DeleteCategory(category_ID)(其中,類別_ID是要刪除的類別),它的行為將按您的要求進行。但不要發(fā)出正常的DELETE FROM查詢,除非需要更多的標準行為(即僅從鏈接表中刪除,然后保留products(單靠桌子)。


查看完整回答
反對 回復 2019-06-28
  • 3 回答
  • 0 關注
  • 969 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號