1. 程式人生 > >MYSQL 的 primary key 和unique key 的區別

MYSQL 的 primary key 和unique key 的區別

Primary key 與Unique Key都是唯一性約束。但二者有很大的區別:

1、Primary key的1個或多個列必須為NOT NULL,如果列為NULL,在增加PRIMARY KEY時,列自動更改為NOT NULL。而UNIQUE KEY 對列沒有此要求。

2、一個表只能有一個PRIMARY KEY,但可以有多個UNIQUE KEY。

下面以測試說明:

SQL> create table t (a int,b int,c int,d int);

Table created.

SQL> desc t
Name                                      Null?    Type
----------------------------------------- -------- -----------

A                                                  NUMBER(38)
B                                                  NUMBER(38)
C                                                  NUMBER(38)
D                                                  NUMBER(38)

SQL> alter table t add constraint pk_t primary key (a,b);

Table altered.

SQL> desc t
Name                                      Null?    Type
----------------------------------------- -------- ----------------

A                                         NOT NULL NUMBER(38)
B                                         NOT NULL NUMBER(38)
C                                                  NUMBER(38)
D                                                  NUMBER(38)

可以看到A、B兩個列都自動改為了NOT NULL

SQL> alter table t modify (a int null);
alter table t modify (a int null)
                      *
ERROR at line 1:
ORA-01451: column to be modified to NULL cannot be modified to NULL
可以看到,列A不允許改為NULL

SQL> alter table t drop constraint pk_t;

Table altered.

SQL> alter table t add constraint uk_t_1 unique (a,b);

Table altered.

SQL> desc t
Name                                      Null?    Type
----------------------------------------- -------- -----------

A                                                  NUMBER(38)
B                                                  NUMBER(38)
C                                                  NUMBER(38)
D                                                  NUMBER(38)

我們看到列A又變回了NULL。

注意到,在刪除主鍵時,列的NULLABLE會回到原來的狀態。如果在建立主鍵後,對原來為NULL的主鍵列,顯式設為NOT NULL,在刪除主鍵後仍然是NOT NULL。比如在建立主鍵後,執行下面的操作,可以看到:

SQL> alter table t modify (b int not null);

Table altered.

SQL> alter table t drop constraint pk_t;

Table altered.

SQL> desc t
Name                                      Null?    Type
----------------------------------------- -------- ----------

A                                                 NUMBER(38)
B                                         NOT NULL NUMBER(38)
C                                                  NUMBER(38)
D                                                  NUMBER(38)

再做如下的實驗:

SQL> drop table t;

Table dropped.

SQL> create table t (a int,b int,c int,d int);

Table created.

SQL> alter table t add constraint uk_t_1 unique (a,b);

Table altered.

SQL> alter table t add constraint uk_t_2 unique (c,d);

Table altered.

可以看到可以增加兩個UNIQUE KEY。看看能不能增加兩個主鍵:

SQL> alter table t add constraint pk_t primary key (c);

Table altered.

SQL> alter table t add constraint pk1_t primary key (d);
alter table t add constraint pk1_t primary key (d)
                                  *
ERROR at line 1:
ORA-02260: table can have only one primary key
由此可以看到一個表只能有一個主鍵。

SQL> alter table t drop constraint pk_t;

Table altered.

SQL> insert into t (a ,b ) values (null,null);

1 row created.

SQL> /

1 row created.

SQL> insert into t (a ,b ) values (null,1);

1 row created.

SQL> /
insert into t (a ,b ) values (null,1)
*
ERROR at line 1:
ORA-00001: unique constraint (SYS.UK_T_1) violated


SQL> insert into t (a ,b ) values (1,null);

1 row created.

SQL> /
insert into t (a ,b ) values (1,null)
*
ERROR at line 1:
ORA-00001: unique constraint (SYS.UK_T_1) violated

主鍵和唯一鍵約束是通過參考索引實施的,如果插入的值均為NULL,則根據索引的原理,全NULL值不被記錄在索引上,所以插入全NULL值時,可以有重複的,而其他的則不能插入重複值。

相關推薦

MYSQLprimary key unique key區別

Primary key 與Unique Key都是唯一性約束。但二者有很大的區別: 1、Primary key的1個或多個列必須為NOT NULL,如果列為NULL,在增加PRIMARY KEY時,列自動更改為NOT NULL。而UNIQUE KEY 對列沒有此要求。 2、一

Mysqlkeyprimary keyunique key 與index區別

條件 那是 database 表空間 可用 where 進行 utf8 擁有 索引被用來快速找出在一個列上用一特定值的行。沒有索引,MySQL不得不首先以第一條記錄開始並然後讀完整個表直到它找出相關的行。 表越大,花費時間越多。如果表對於查詢的列有一個索引,MySQL能快

mysql 建立、刪除 索引 keyprimary keyunique key 與index區別

建立:creta index test_suoying(索引的欄位名) on 表名;  刪除:drop index index_name on table_name ; 一、key與primary key區別CREATE TABLE wh_logrecord ( logre

Private key Secret key區別

兩者都可以用來加密資料,但他們有什麼區別呢? 簡單來說,二者在加密上使用的技術不同:     secret key 是對稱加密演算法(Symmetric encryption)中的概念,此演算法中資訊的傳送者和接受者擁有相同的secret key來加密和解密資訊.

14、MySQL-唯一約束(UNIQUE KEY

保證記錄的唯一性,一個表中可以有多個唯一性約束,空值不受唯一性約束 唯一性約束格式 CREATE TABLE tbl_name(    欄位名稱 欄位型別 UNIQUE KEY ); mysql> CREATE TABLE IF NOT EXISTS tes

mysql,mysqliPDO的區別

active column attribute oca 數字 proc string att 以及 介紹: PHP-MySQL 是 PHP 操作 MySQL 資料庫最原始的 Extension PHP-MySQLi 的 i 代表 Improvement ,提更了相對進階的

mysql中nowsysdate的區別

mysql now和sysdatemysql 中now獲取的是sql執行的時間,sysdate獲取的是系統時間在master 和slave 主從過程中會導致時間的不一致導致報錯例如:Unsafe statement written to the binary log using statement form

淺談Mysql中wherehaving的區別

where和having的區別一、誤區:不要錯誤的認為having和group by 必須配合使用.二、where和having用法解析:1、 where和having都可以使用的場景: select goods_price,goods_name from goods where goods_price &g

MySQL儲存過程函式的區別與優缺點

為什麼要使用儲存過程和函式 資料庫物件儲存過程和函式,是用來實現一組關於表操作的SQL語句程式碼當做一個整體來執行。一個完整的操作會包含多條SQL語句,在執行過程中需要根據前面的SQL語句來執行結果有選擇的執行後面的SQL語句。 儲存過程和函式可以簡單的理解為一條或多條SQL語句的集合

mysql 中inexists的區別

有兩張表:student 和 studentcource student 表 studentcource 表 需求:查詢所有成績小宇60分的同學 in 原理: 1、先查詢 <60 學生得到student_id列表 select student_id

MySQL中 char varchar 的區別

 一、VARCHAR與CHAR字元型資料的差異   在MySQL資料庫中,用的最多的字元型資料型別就是Varchar和Char,這兩種資料型別雖然都是用來存放字元型資料,但是無論從結構還是從資料的儲存方式來看,兩者相差很大。而且其具體的實現方式,還依賴與儲存引擎。我這裡就以大家最常用的MYISAM儲

MySql中existsin的區別

exists介紹 exists對外表用loop逐條查詢,每次查詢都會檢視exists的條件語句,當 exists裡的條件語句能夠返回記錄行時(無論記錄行是的多少,只要能返回),條件就為真,返回當前loop到的這條記錄,反之如果exists裡的條 件語句不能返回記錄行,則當前loop到的這條

MySql中wherehaving的區別

    1、where 後不能跟聚合函式,因為where執行順序大於聚合函式。     2、where 子句的作用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分組之前過濾資料,條件 中不能包含聚組函式,使用where條件顯示特定的行。     3、hav

說說MySQL索引MyISAMInnoDB的區別

如題,廢話不多說, 首先兩者都是使用B+樹作為底層的資料結構的。 下圖是MyISAM索引的原理圖(圖是網上找的。。。): 這個圖就很明顯了: 1,葉節點的data域存放的是資料記錄的地址。MyISAM的索引與行記錄是分開儲存的,叫做非聚集索引(U

SpringCloud工作筆記071---mysql字符集 utf8 utf8mb4 的區別_utf8是不能儲存emoji表情字符集的

    JAVA技術交流QQ群:170933152  可以簡單的理解 utf8mb4 是目前最大的一個字元編碼,支援任意文字. 為什麼會有UTF8MB4? 既然utf8應付日常使用完全沒有問題,那為什麼還要使用utf8mb4呢? 低版本的MySQL

第9課 如何變更EOS賬號的active keyowner key

1,摘要 【本文目標】 通過本文學習,可以通過EOS本地環境完成EOS註冊賬號的active key和owner key的變更。 在EOS賬號是其他人代為註冊時,私鑰往往也被其他人知曉,存在洩漏風險,建議儘快完成變更。 【技術收穫】 1) cleos set

全面瞭解mysql中utf8utf8mb4的區別

一.簡介         MySQL在5.5.3之後增加了這個utf8mb4的編碼,mb4就是most bytes 4的意思,專門用來相容四位元組的unicode。好在utf8mb4是utf8的超集,除了將編碼改為utf8mb4外不需要做其他轉換。當然,為了節省空間,一

如何處理redis叢集中hot keybig key

概述 redis 叢集部署方式大部分採用類 Twemproxy 的方式進行部署。即通過 Twemproxy 對 redis key 進行分片計算,將 redis key 進行分片計算,分配到多個 redis 例項中的其中一個。tewmproxy 架構圖如下: 由於 Twemproxy 背後

MySQL中interactive_timeoutwait_timeout的區別 MySQL中interactive_timeoutwait_timeout的區別

MySQL中interactive_timeout和wait_timeout的區別   在用mysql客戶端對資料庫進行操作時,開啟終端視窗,如果一段時間沒有操作,再次操作時,常常會報如下錯誤: ERROR 2013 (HY000): Lost connect

mysql中exitin的區別

原文地址:https://segmentfault.com/a/1190000008709410 提前準備 為了大家學習方便,北哥在這裡面建立兩張表併為其新增一些資料 一張會員表,一張會員下單表。 會員表資料 id user email