2011-12-14 69 views
3

嗨,我是一個在網絡開發領域的全新手。我想創建一個只有一條記錄的管理員登錄表(因爲只有一個管理員)。我想知道是否有可能設置MySQL以某種方式限制一個特殊的表只有一個記錄?是否有可能限制一個表只有一個記錄在mysql中?

+1

對該表進行插入觸發 – chance 2011-12-14 10:59:43

+1

您無法使用MySQL進行創建。你能解釋一下你爲什麼要這樣做嗎? – pltvs 2011-12-14 11:00:09

回答

1

有很多方法可以做到比數據庫中的「強制一行」更好。

  1. 創建一個用戶表並在其中創建一個字段,該字段是將用戶標識爲管理員的標誌。這可能是簡單的:

    create table users (id int not null primary key auto_increment, name varchar(20), is_admin bool default 0);

    然後你只需設置is_admin1一個管理員和搜索管理員:

    select id,name from users where is_admin;

    不屬於管理員的所有用戶:

    select id,name from users where not is_admin;

  2. 創建另一張使用外鍵關係將用戶標識爲管理員的表。

    create table users (id int not null auto_increment primary key, name varchar(25));

    create table admins (id int not null auto_incrememnt primary key, userid int, foreign key (userid) references users(id));

    現在你只需將refernce添加到admins當你將是一個管理員用戶。此方法允許您在此admins表中使用其他標誌和屬性(而不是稍後在users表中添加大量列)。

+0

感謝布漢提出了另一種方法 – pouya 2011-12-14 15:09:08

3

而其他的答案是正確的,也有對特定的問題更好的方法,也可以加上空枚舉列只有一個單一的情況下,並使其成爲一個UNIQUE KEY(創建一個單行表或表的PRIMARY KEY):

mysql> CREATE TABLE only_one_row (
    restriction ENUM('') NOT NULL, 
    single_row_value DATETIME NOT NULL, 
    PRIMARY KEY (restriction) 
); 
Query OK, 0 rows affected (0.00 sec) 

mysql> INSERT INTO only_one_row (single_row_value) VALUES (NOW()); 
Query OK, 1 rows affected (0.00 sec) 

mysql> INSERT INTO only_one_row (single_row_value) VALUES ('2016-01-01'); 
ERROR 1062 (23000): Duplicate entry '' for key 'PRIMARY" 

mysql> SELECT * FROM only_one_row; 
+-------------+---------------------+ 
| restriction | single_row_value | 
+-------------+---------------------+ 
|    | 2016-01-01 00:00:00 | 
+-------------+---------------------+ 

這工作,因爲該列永遠只能有一個值(ENUM只有一個的情況下,也不可能是NULL),以及UNIQUE(或PRIMARY)鍵強制實施表中的每一行都必須有一個列的值不同。

這可以以明顯的方式進行擴展,以創建只能包含0和任意特定行數之間的表格,達到ENUM的實際限制。 MySQL 5.7中的限制實際上是255個情況,但是到那時,取代TINYINT UNSIGNED列的UNQIUE KEY會更容易。但是,我找不到一種方法來強制執行一個表有 0或N行;這個解決方案只會強制「在0和N之間」,因爲MySQL沒有工作約束。 (當然,其中N爲一個,如在本實施例中,相同的效果。)

:雖然它可能似乎可以使用生成的虛擬列,以避免佔用存儲的額外的字節對於限制枚舉,不幸的是,大多數版本的MySQL和MariaDB在嘗試時會拋出各種錯誤,要麼是因爲常量值不能用於生成的列,要麼是欺騙數據庫以允許該值(例如,使用GENERATED ALWAYS AS (LEAST(GREATEST(single_row_value,0),0)) VIRTUAL ),因爲存儲引擎不喜歡在虛擬生成的列上放置索引。這被記錄爲自5.7.8以來在MySQL中爲InnoDB工作,但在撰寫本文時,它絕對不適用於MariaDB 10.1。

編輯補充:這不是萬無一失的。 ENUM的「錯誤」值爲零,索引從1開始,因此INSERT INTO only_one_row VALUES (0,...); INSERT INTO only_one_row VALUES (1,...);將成功。但是,這種情況在正常運行中不太可能出現,並且跟蹤觸發比觸發更容易!

相關問題