DROP TABLE DB2ITFE.test1;
CREATE TABLE DB2ITFE.test1
(
s_id BIGINT NOT NULL,
s_name VARCHAR (20) NOT NULL,
s_age INT,
PRIMARY KEY (s_id)
)
IN USERSPACE1;
--創建索引 注意s_name爲null也不影響索引生效
CREATE UNIQUE INDEX index_1 ON DB2ITFE.TEST1(S_NAME);
--刪除索引
DROP INDEX index_1;
/**
*此時S_NAME不允許爲null,且表定義時必須加上not null 約束
*SQL0598W 現有索引 "DB2ITFE.INDEX_1" 被用作主鍵或唯一鍵的索引。 SQLSTATE=01550 提示此信息並不影響索引的創建,相反會優化替換原有的索引
* 刪除此索引後,原索引會顯示在表定義中
*/
ALTER TABLE test1 ADD CONSTRAINT uk_index UNIQUE(S_NAME); //
ALTER TABLE test1 DROP CONSTRAINT uk_index;
INSERT INTO DB2ITFE.TEST1
(
S_ID,
S_NAME,
S_AGE
)
VALUES
(
32,
null,
32
)
--創建索引 注意s_name爲null也不影響索引生效
CREATE UNIQUE INDEX index_1 ON DB2ITFE.TEST1(S_NAME);
DROP TABLE DB2ITFE.TEST1;
CREATE TABLE DB2ITFE.TEST1
(
S_ID BIGINT NOT NULL,
S_NAME VARCHAR (20) NOT NULL,
S_AGE INTEGER,
PRIMARY KEY (S_ID)
)
IN USERSPACE1;
ALTER TABLE DB2ITFE.TEST1 DATA CAPTURE NONE;
ALTER TABLE DB2ITFE.TEST1 NOT VOLATILE;
ALTER TABLE DB2ITFE.TEST1 APPEND OFF;
ALTER TABLE DB2ITFE.TEST1 LOCKSIZE ROW;
CREATE UNIQUE INDEX DB2ITFE.INDEX_1
ON DB2ITFE.TEST1 (S_NAME) ALLOW REVERSE SCANS;
/**
*此時S_NAME不允許爲null,且表定義時必須加上not null 約束
*SQL0598W 現有索引 "DB2ITFE.INDEX_1" 被用作主鍵或唯一鍵的索引。 SQLSTATE=01550 提示此信息並不影響索引的創建,相反會優化替換原有的索引
* 刪除此索引後,原索引會顯示在表定義中
*/
ALTER TABLE test1 ADD CONSTRAINT uk_index UNIQUE(S_NAME); //
DROP TABLE DB2ITFE.TEST1;
CREATE TABLE DB2ITFE.TEST1
(
S_ID BIGINT NOT NULL,
S_NAME VARCHAR (20) NOT NULL,
S_AGE INTEGER,
PRIMARY KEY (S_ID),
CONSTRAINT UK_INDEX UNIQUE (S_NAME)
)
IN USERSPACE1;
ALTER TABLE DB2ITFE.TEST1 DATA CAPTURE NONE;
ALTER TABLE DB2ITFE.TEST1 NOT VOLATILE;
ALTER TABLE DB2ITFE.TEST1 APPEND OFF;
ALTER TABLE DB2ITFE.TEST1 LOCKSIZE ROW;
--刪除唯一索引
ALTER TABLE test1 DROP CONSTRAINT uk_index;
DROP TABLE DB2ITFE.TEST1;
CREATE TABLE DB2ITFE.TEST1
(
S_ID BIGINT NOT NULL,
S_NAME VARCHAR (20) NOT NULL,
S_AGE INTEGER,
PRIMARY KEY (S_ID)
)
IN USERSPACE1;
ALTER TABLE DB2ITFE.TEST1 DATA CAPTURE NONE;
ALTER TABLE DB2ITFE.TEST1 NOT VOLATILE;
ALTER TABLE DB2ITFE.TEST1 APPEND OFF;
ALTER TABLE DB2ITFE.TEST1 LOCKSIZE ROW;
CREATE UNIQUE INDEX DB2ITFE.INDEX_1
ON DB2ITFE.TEST1 (S_NAME) ALLOW REVERSE SCANS;
唯一索引和普通索引使用的結構都是B-tree,執行時間複雜度都是O(log n)。
1、普通索引
普通索引(由關鍵字KEY或INDEX定義的索引)的唯一任務是加快對數據的訪問速度。
因此,應該只爲那些最經常出現在查詢條件(WHEREcolumn=)或排序條件(ORDERBYcolumn)中的數據列創建索引。
只要有可能,就應該選擇一個數據最整齊、最緊湊的數據列(如一個整數類型的數據列)來創建索引。
2、唯一索引
普通索引允許被索引的數據列包含重複的值。比如說,因爲人有可能同名,
所以同一個姓名在同一個“員工個人資料”數據表裏可能出現兩次或更多次。
如果能確定某個數據列將只包含彼此各不相同的值,在爲這個數據列創建索引的時候就應該用關鍵字UNIQUE把它定義爲一個唯一索引。
這麼做的好處:
一是簡化了MySQL對這個索引的管理工作,這個索引也因此而變得更有效率;
二是MySQL會在有新記錄插入數據表時,自動檢查新記錄的這個字段的值是否已經在某個記錄的這個字段裏出現過了;
如果是,MySQL將拒絕插入那條新記錄。也就是說,唯一索引可以保證數據記錄的唯一性。
事實上,在許多場合,人們創建唯一索引的目的往往不是爲了提高訪問速度,而只是爲了避免數據出現重複。