日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
mysql怎么把約束刪掉,mysql怎么刪除主鍵約束

MySQL 關(guān)于去除約束的問題

現(xiàn)在要說的是在列這一層次過濾的基于表定義之前就規(guī)范好的 CHECK 約束。(MySQL 版本 = 8.0.16)

成都創(chuàng)新互聯(lián)公司長期為上千多家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為秀洲企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、成都做網(wǎng)站,秀洲網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

mysql create table f1 (r1 int constraint tb_f1_r1_chk1 check (mod(r1,3)=0));

Query OK, 0 rows affected (0.03 sec)

mysql create table f2 (r1 int constraint tb_f2_r1_chk1 check (mod(r1,3)=0) not enforced);

Query OK, 0 rows affected (0.02 sec)

這里 CHECK 約束的相關(guān)限制如下:

1. constraint 名字在每個數(shù)據(jù)庫中唯一。

也就是說單個數(shù)據(jù)庫里不存在相同的兩個 constraint,如果不定義,系統(tǒng)自動生成一個唯一的約束名字。

2. check 約束針對語句 insert/update/replace/load data/load xml 生效;針對對應(yīng)的 ignore 語句失效。

3. 并非每個函數(shù)都可以使用,比如函數(shù)結(jié)果不確定的:NOW(),CONNECTION_ID(),CURRENT_USER()。

4. 不適用于存儲過程和存儲函數(shù)。

5. 系統(tǒng)變量不適用。

6. 子查詢不適用。

7. 外鍵動作(比如 ON UPDATE, ON DELETE) 不適用。

8. enforced 默認(rèn)啟用,如果單獨加上 not enforced ,check 約束失效。

mysql 如何刪除非空約束

NULL 對外部程序來說,具體為不知道、不確切的、無法表述的值。所以在很多家公司的開發(fā)規(guī)范里都明確規(guī)定了,必須為 NOT NULL。

其實用到 NULL 的場景都可以轉(zhuǎn)換為有意義的字符或者數(shù)值,一是有利用數(shù)據(jù)的易讀性以及后期的易維護(hù)性;二是降低 SQL 語句的編寫難度。

關(guān)于 NULL 的特性如下:

1. 參與 NULL 字段拼接的結(jié)果都為 NULL,預(yù)期的可能會有差異

預(yù)想把字段 r1 做個拼接,再插入到新的表 t3 里,結(jié)果 t3 表的記錄全為 NULL,跟預(yù)期不符。

mysql show create table t1\G

*************************** 1. row ***************************

Table: t1

Create Table: CREATE TABLE `t1` (

`r1` varchar(10) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

1 row in set (0.00 sec)

mysql show create table t2\G

*************************** 1. row ***************************

Table: t2

Create Table: CREATE TABLE `t2` (

`r1` varchar(10) NOT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

1 row in set (0.00 sec)

mysql create table t3 like t1

Query OK, 0 rows affected (0.04 sec)

mysql insert into t3 select concat(r1,'database') from t1 limit 2;

Query OK, 2 rows affected (0.02 sec)

Records: 2 Duplicates: 0 Warnings: 0

mysql select * from t3;

+------+

| r1 |

+------+

| NULL |

| NULL |

+------+

2 rows in set (0.00 sec)

那正確的方法如下,對 NULL 用函數(shù) IFNULL 特殊處理。

mysql insert into t3 select concat(ifnull(r1,''),'database') from t1 limit 2;

Query OK, 2 rows affected (0.01 sec)

Records: 2 Duplicates: 0 Warnings: 0

mysql select * from t3;

+----------+

| r1 |

+----------+

| database |

| database |

+----------+

2 rows in set (0.00 sec)

2. 對于包含 NULL 列的求 COUNT 值也不準(zhǔn)確

t1 和 t2 的記錄數(shù)是一樣的,但是字段 r1 包含了 NULL,這導(dǎo)致結(jié)果忽略了這些值。

mysql select count(r1) as rc from t1;

+-------+

| rc |

+-------+

| 16384 |

+-------+

1 row in set (0.01 sec)

mysql select count(r1) as rc from t2;

+-------+

| rc |

+-------+

| 32768 |

+-------+

1 row in set (0.03 sec)

這時候我們可能想到了,正確的方法是用 NULL 相關(guān)函數(shù)處理,

mysql select count(ifnull(r1,'')) as rc from t1;

+-------+

| rc |

+-------+

| 32768 |

+-------+

1 row in set (0.03 sec)

或者是直接用 COUNT(*) 包含了所有可能的值

mysql select count(*) as rc from t1;

+-------+

| rc |

+-------+

| 32768 |

+-------+

1 row in set (0.02 sec)

當(dāng)然了不僅僅是 COUNT,除了 NULL 相關(guān)的函數(shù),大部分對 NULL 處理都不友好。

所以其實從上面兩點來看,NULL 的處理都得特殊處理,額外增加了編寫 SQL 的難度。

3. 包含 NULL 的索引列

對包含 NULL 列建立索引,比不包含的 NULL 的字段,要多占用一個 BIT 位來存儲。

示例

key_len 分別為 43 和 42,t1 比 t2 多了一個字節(jié),那這里可能有人要問了,不是說占了一個 BIT 位嗎?那為什么多了一個字節(jié)?可以關(guān)注我上一篇文章(第02期:MySQL 數(shù)據(jù)類型的藝術(shù) - 大對象字段)關(guān)于 BIT 的詳細(xì)描述。

mysql pager grep -i 'key_len'

PAGER set to 'grep -i 'key_len''

mysql explain select * from t1 where r1 = ''\G

key_len: 43

1 row in set, 1 warning (0.00 sec)

mysql explain select * from t2 where r1 = ''\G

key_len: 42

1 row in set, 1 warning (0.00 sec)

4. 各存儲引擎相關(guān)的對 NULL 的處理

在 MySQL 8.0 發(fā)布后,僅有 InnoDB、MyISAM 和 Memory 支持對包含 NULL 列的索引,其他引擎不支持。比如 NDB。

mysql怎么刪除有外鍵約束的數(shù)據(jù)

分兩步走:

確認(rèn)受外鍵約束的數(shù)據(jù)是否可用同步刪除。如果可用則直接刪除,如果不可以則接觸外鍵約束。

外鍵解除或受外鍵約束數(shù)據(jù)被刪除后,可用直接刪除自身數(shù)據(jù)。

alter table test drop foreign key 外鍵名稱;


標(biāo)題名稱:mysql怎么把約束刪掉,mysql怎么刪除主鍵約束
本文來源:http://www.dlmjj.cn/article/hdedgg.html