如何證明每個MySQL列舉都有一個索引值?
實際上,ENUM 列規範中列出的元素被分配了從 1 開始的索引號。這裡“索引”一詞指的是列舉值列表中的位置,與表索引無關。透過以下示例,我們可以證明每個 MySQL 列舉都有一個索引值:
透過插入索引號代替列舉值
我們可以使用索引號而不是編寫值來在 ENUM 列中插入值。例如,在下表中,我們有兩個 ENUM 值“pass”和“fail”。由於“pass”在列舉列表中首先出現,因此獲得了索引號“1”,而“fail”則為“2”。現在我們也可以透過插入索引號來插入值,如下所示:
mysql> Insert into marks(id,name,result)values(103,'Daksh','1'); Query OK, 1 row affected (0.06 sec) mysql> Insert into marks(id,name,result)values(104,'Shayra','2'); Query OK, 1 row affected (0.07 sec) mysql> Select * from marks; +-----+---------+--------+ | id | Name | Result | +-----+---------+--------+ | 101 | Aarav | Pass | | 102 | Yashraj | Fail | | 103 | Daksh | Pass | | 104 | Shayra | Fail | +-----+---------+--------+ 4 rows in set (0.00 sec)
在上面的查詢中,我們分別使用了索引號 1 和 2 來表示列舉值 pass 和 fail。
透過插入空字串代替列舉值
空字串的索引值為 0。在插入空字串之前,SQL 模式必須不是 TRADITIONAL、STRICT_TRANS_TABLES 或 STRICT_ALL_TABLES。透過以下示例,我們可以理解它:
mysql> SET SESSION sql_mode = ''; Query OK, 0 rows affected (0.00 sec) mysql> Insert into marks(id, name, result) values(105,'Yashraj',''); Query OK, 1 row affected, 1 warning (0.06 sec)
上面的查詢將在列舉值的位置插入空字串。MySQL 會在插入空字串時顯示以下警告。
mysql> Show warnings; +---------+------+---------------------------------------------+ | Level | Code | Message | +---------+------+---------------------------------------------+ | Warning | 1265 | Data truncated for column 'Result' at row 1 | +---------+------+---------------------------------------------+ 1 row in set (0.00 sec)
現在,當我們檢查表時,可以看到 ENUM 欄位中有一個空字串。
mysql> Select * from marks; +-----+---------+--------+ | id | Name | Result | +-----+---------+--------+ | 101 | Aarav | Pass | | 102 | Yashraj | Fail | | 103 | Daksh | Pass | | 104 | Shayra | Fail | | 105 | Yash | | +-----+---------+--------+ 5 rows in set (0.00 sec) mysql> Select result+0 As result_index from marks; +--------------+ | result_index | +--------------+ | 1 | | 2 | | 1 | | 2 | | 0 | +--------------+ 5 rows in set (0.01 sec) From the output of above query, it is clear that the index value of the empty string is 0.
透過插入 NULL 代替列舉值
我們可以在列舉值的位置插入 NULL,因為我們沒有為 ENUM 列指定 NOT NULL。NULL 的索引值為 NULL。例如,透過以下查詢,我們在表“result”的列舉列中插入 NULL,並可以檢查其索引值。
mysql> Create table result(Id INT PRIMARY KEY NOT NULL, Name Varchar(10), GradeENUM('POOR','GOOD')); Query OK, 0 rows affected (0.25 sec) mysql> Insert into result(id, name, grade) values(100, 'Rahul', NULL); Query OK, 1 row affected (0.06 sec)
上面的查詢在列舉值的位置插入了值 NULL,可以使用下面的查詢進行檢查:
mysql> Select * from result; +-----+-------+-------+ | Id | Name | Grade | +-----+-------+-------+ | 100 | Rahul | NULL | +-----+-------+-------+ 1 row in set (0.00 sec)
現在,透過下一個查詢,我們可以觀察到 NULL 的索引值為 NULL。
mysql> Select Grade+0 As Grade_index from result; +-------------+ | Grade_index | +-------------+ | NULL | +-------------+ 1 row in set (0.00 sec)
廣告