嗨,我是一個在網絡開發領域的全新手。我想創建一個只有一條記錄的管理員登錄表(因爲只有一個管理員)。我想知道是否有可能設置MySQL以某種方式限制一個特殊的表只有一個記錄?是否有可能限制一個表只有一個記錄在mysql中?
回答
您可以設置一個觸發器(具體而言,一個插入觸發器)來計數記錄,如果count大於1,則不允許插入操作。
檢出http://dev.mysql.com/doc/refman/5.0/en/insert.html並相應地設置您的邏輯。
有很多方法可以做到比數據庫中的「強制一行」更好。
創建一個用戶表並在其中創建一個字段,該字段是將用戶標識爲管理員的標誌。這可能是簡單的:
create table users (id int not null primary key auto_increment, name varchar(20), is_admin bool default 0);
然後你只需設置
is_admin
到1
一個管理員和搜索管理員:select id,name from users where is_admin;
不屬於管理員的所有用戶:
select id,name from users where not is_admin;
創建另一張使用外鍵關係將用戶標識爲管理員的表。
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
表中添加大量列)。
感謝布漢提出了另一種方法 – pouya 2011-12-14 15:09:08
而其他的答案是正確的,也有對特定的問題更好的方法,也可以加上空枚舉列只有一個單一的情況下,並使其成爲一個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,...);
將成功。但是,這種情況在正常運行中不太可能出現,並且跟蹤觸發比觸發更容易!
- 1. 是否有可能限制socket.io每個事件只有一個偵聽器?
- 2. 是否有可能在Django中只記錄一個視圖的查詢?
- 3. rails3是否有可能創建一個沒有限制的model.scope
- 4. 限制一個表只有一行
- 5. MySql UPDATE只有一個重複記錄
- 6. 是否有可能在一個表中有兩個FILESTREAM列?
- 7. 是否有可能在設計階段限制一個sql表格只有一行
- 8. 只有一個記錄sql
- 9. 是否有可能在QTableWidget中只能選擇一個項目
- 10. 是否有可能通過mysqldump在某個特定的MySQL表中備份一些記錄?這是一個有很多記錄的表格
- 11. 是否有可能在另一個ScrollView中有一個ScrollView?
- 12. 是否有可能在一個Activity中有一個scrollview?
- 13. 只有一個記錄的更新表
- 14. 將日誌記錄限制爲只有一個jar log4j
- 15. MYSQL:是否有可能將多行記錄串聯成一行
- 16. 是否有可能在Scala中創建一個「受限範圍」?
- 17. YAML:是否有可能在根節中有一個列表?
- 18. 是否有可能有一個Enum.each
- 19. 在MySQL中,是否有可能在一行上有一個UNIQUE約束?
- 20. 是否有可能在一個表中創建兩個主鍵
- 21. 是否有可能有一個函數在另一個函數
- 22. 是否有可能在一個子內有一個子?
- 23. 只返回記錄沒有記錄關聯在另一個表
- 24. 是否有可能有一個總是等於另一個MYSQL字段?
- 25. 是否有可能在一個Kendo.Mvc.UI.Fluent.MultiSelectBuilder
- 26. 是否有可能在一個JEditorPane
- 27. 是否有可能強制記錄尊重一些不變量?
- 28. 是否有可能在MySQL中執行一個字符串?
- 29. 是否有可能有一個MySQL表引用外部數據庫中的表?
- 30. 更新記錄,但限制爲每個重複記錄只有一行
對該表進行插入觸發 – chance 2011-12-14 10:59:43
您無法使用MySQL進行創建。你能解釋一下你爲什麼要這樣做嗎? – pltvs 2011-12-14 11:00:09