首頁 資料庫 mysql教程 【Mysql】外键级联与级联的劣势_MySQL

【Mysql】外键级联与级联的劣势_MySQL

Jun 01, 2016 pm 12:59 PM
劣勢

在建表的时候时候,可以对于删除delete、修改update设置为级联。用一个例子先说明外键级联级联的概念

假如数据库中本以存在一张usertable如下:

\

此user表非常简单,id为主键。

下面我将新建一张cascade_test表如下,这里的user_id与usertable的主键id形成参照完整性,并同时建立删除与修改的级联:

\

如果用SQL语句建立上图的表则如下:

 

CREATE TABLE `test`.`cascade_test` (
  `id` INTEGER UNSIGNED NOT NULL auto_increment,
  `content` TEXT,
  `user_id` INTEGER UNSIGNED, -- 由于usertable的主键是INTEGER UNSIGNED,这里必须同为这样类型,键值对应
  PRIMARY KEY (`id`),
  CONSTRAINT `FK_cascade_test_1` FOREIGN KEY `FK_cascade_test_1` (`user_id`)
    REFERENCES `test`.`usertable`(`id`)
    ON DELETE CASCADE
    ON UPDATE CASCADE
)
ENGINE = InnoDB; -- 数据库引擎设置,可以没有
登入後複製
比起普通设置外键的语句,在其下多出了两个级联的声明,ON DELETE CASCADE、ON UPDATE CASCADE

设置级联与不设置级联,在参照完整性上是没有区别的。

user的id类型是怎么cascade_test的user_id类型就应该怎么样,这里需要严格照抄,由于user的id设置为无符号整形,这里cascade_test的user_id还不能是整形,一定要特意声明为无符号整形,否则会出现如下的[Err] 1005 - Can't create table 'xx' (errno: 150),其实150页就是参照完整性错误。
\

之后,在新建出来的cascade_test插入如下一些数据:

\

同样地,由于参照完整性的存在,cascade_test的user_id的取值范围还需要在user的id现有的值来取。

设置级联与不设置级联唯一的区别,就是我们在删除user的id中数据的同时,同样会删除cascade_test的user_id的所有有关字段。修改级联同样如此。

比如将user中id为6的项删除,也就是执行如下的语句:

delete from usertable where id=6
登入後複製

 

运行效果如下图:

\

usertable中id=6的项被删除是肯定的,

由于删除级联的存在:cascade_test中user_id=6的项通通被删除。

如果不设置级联,在usertable中id=6的项被删除的同时,cascade_test中user_id=6的项是不会删除的。造成了一定参照完整性的缺失。

下面说说级联的劣势:

这看来似乎很强大的样子,尤其是在网页编程的时候,就不用写这么多删除语句了,仅仅是删除一个主键,就能把所有涉及的项删除

但是,在你的工程足够的时候,这样的删除会很慢,实质上造成了表与表之间的耦合。远远比不删新增加一个isDel的项,使用标志删除的方式,查表的时候仅查询isDel=false的项。其实delete语句在网页的编程的时间根本就是可以扔掉的。这样还有个好处,出现在需要找被删除的旧数据的时候,绝对可以找回来。

这样你的网页的运行速度会大大加快,否则如果一旦执行级联删除的语句,会涉及的表足够多的时候,执行起来将会足够慢。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

深度剖析:jQuery的優勢與劣勢 深度剖析:jQuery的優勢與劣勢 Feb 27, 2024 pm 05:18 PM

jQuery是一款廣泛應用於前端開發的快速、小巧、功能豐富的JavaScript庫。自2006年發布以來,jQuery已成為眾多開發者的首選工具之一,但在實際應用中,它也不乏一些優點和缺點。本文將深度剖析jQuery的優勢與劣勢,並結合具體的程式碼範例進行說明。優點:1.簡潔的語法jQuery的語法設計簡潔明了,可以大幅提升程式碼的可讀性和編寫效率。比如,

使用 serverless 架構部署 PHP 應用的優點和缺點是什麼? 使用 serverless 架構部署 PHP 應用的優點和缺點是什麼? May 06, 2024 pm 09:15 PM

使用Serverless架構部署PHP應用程式具有以下優點:免維護、按需付費、高度可擴展、簡化開發和支援多種服務。缺點包括:冷啟動時間、調試困難、鎖定供應商、功能限制和成本優化挑戰。

vr有哪些優點和缺點 vr有哪些優點和缺點 Dec 20, 2023 pm 05:31 PM

vr的優勢:1、沉浸式體驗;2、互動性;3、多樣性;4、安全性;5、便利性。 vr的劣勢:1、技術門檻高;2、眩暈感;3、依賴;4、隱私外洩風險;5、成本高。 VR技術是一種先進的互動式技術,它透過模擬人的視聽感知,創造一個完全虛擬的場景,使得使用者可以在其中進行互動和體驗。在未來的發展中,隨著技術的不斷進步和應用領域的不斷拓展,VR技術將會得到更廣泛的應用和發展。

用golang框架開發的好處和缺點是什麼? 用golang框架開發的好處和缺點是什麼? Jun 02, 2024 pm 07:30 PM

Go框架開發的優點包括:高效的效能、卓越的並發性、簡單的語法、豐富的標準函式庫、強型別語言和跨平台支援。缺點包括:缺乏泛型、新手經驗不足、外部函式庫依賴性、煩瑣的錯誤處理和HTTP路由效能受限。

改進靜態重定位技術的不足之處及解決方法 改進靜態重定位技術的不足之處及解決方法 Jan 28, 2024 am 09:28 AM

靜態重定位技術是一種用於將軟體或應用程式載入到記憶體中並分配記憶體位址的技術。它的目的是使程式可以在不同的環境中運行,無需修改原始程式碼。然而,靜態重定位技術也存在一些劣勢。本文將探討這些劣勢,並提出一些改善方法。首先,靜態重定位技術可能會導致記憶體碎片。當程式運作時,它會分配一塊連續的記憶體空間來儲存指令、資料和堆疊。然而,隨著程式運行的時間增長,一些記憶體區塊可能會被釋

深入解析Go語言的劣勢及改進方向 深入解析Go語言的劣勢及改進方向 Mar 27, 2024 pm 05:33 PM

在電腦程式設計領域,Go語言作為一種開發效率高、並發性能強的程式語言,受到了廣泛的關注與應用。然而,正如任何一種程式語言一樣,Go語言也存在著一些劣勢,需要不斷改進和最佳化。本文將深入探討Go語言的劣勢及改善方向,並結合具體的程式碼範例進行分析。一、劣勢分析異常處理不夠靈活在Go語言中,錯誤處理機制主要透過傳回錯誤值來實現,雖然簡單且高效,但對於複雜的錯誤處

go語言的優勢與劣勢 go語言的優勢與劣勢 Oct 26, 2023 am 09:46 AM

Go語言作為一種現代化的程式語言,具有簡潔易學、並發性能強、記憶體管理高效、跨平台支援等優點。但是,它也存在生態系統相對較小、泛型支援不完善、錯誤處理方式有限、缺乏一些高階特性等劣勢。開發人員在選擇使用Go語言時,需要根據特定的應用場景和需求進行權衡和選擇。

深入探討Go程式語言的優點和缺點 深入探討Go程式語言的優點和缺點 Mar 09, 2024 pm 05:03 PM

深入探討Go程式語言的優點和缺點Go語言,也稱為Golang,是一種開源程式語言,由Google開發。自2009年發布以來,Go語言在軟體開發領域備受關注,並廣泛應用於網路程式設計、雲端運算、大數據處理等多個領域。本文將深入探討Go語言的優勢和劣勢,並透過具體的程式碼範例來說明。優勢1.同時程式設計能力強Go語言內建goroutine和channel,讓並發程式設計變得簡單而高效

See all articles