Mysql 如何确保DB表中只有一行?
我希望确保名为“myTable”的MySQL表只有一行 所以我需要能够更新这一行,但显然插入和删除应该是不可能的 我问这个问题是因为这个Mysql 如何确保DB表中只有一行?,mysql,database,database-design,privileges,Mysql,Database,Database Design,Privileges,我希望确保名为“myTable”的MySQL表只有一行 所以我需要能够更新这一行,但显然插入和删除应该是不可能的 我问这个问题是因为这个 谢谢 您可以使用表权限(假设一旦您将相关权限设置为阻止插入/删除,并且您不应该再更新权限,但是,任何拥有该权限的用户都可以再次覆盖该权限) 首先插入一条且仅一条记录 然后通过在列表_priv中禁用插入、更新、删除来添加权限 mysql> desc tables_priv; +-------------+-----------------------------
谢谢 您可以使用表权限(假设一旦您将相关权限设置为阻止插入/删除,并且您不应该再更新权限,但是,任何拥有该权限的用户都可以再次覆盖该权限) 首先插入一条且仅一条记录 然后通过在列表_priv中禁用
插入、更新、删除
来添加权限
mysql> desc tables_priv;
+-------------+-------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-------+
| Host | char(60) | NO | PRI | | |
| Db | char(64) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Table_name | char(64) | NO | PRI | | |
| Grantor | char(77) | NO | MUL | | |
| Timestamp | timestamp | NO | | CURRENT_TIMESTAMP | |
| Table_priv | set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view') | NO | | | |
| Column_priv | set('Select','Insert','Update','References') | NO | | | |
+-------------+-------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-------+
8 rows in set (0.00 sec)
mysql>desctables\u priv;
+-------------+-------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-------+
|字段|类型|空|键|默认|额外|
+-------------+-------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-------+
|主持人| char(60)| NO | PRI ||
|Db | char(64)| NO | PRI ||
|用户|字符(16)|否|优先级||
|表|名称|字符(64)|编号|优先级||
|授予人| char(77)| NO | MUL ||
|时间戳|时间戳|否| |当前| U时间戳||
|表| priv | set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show View')否| ||
|列| priv | set('Select'、'Insert'、'Update'、'References')| NO | ||
+-------------+-------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-------+
一组8行(0.00秒)
您可以使用IF语句签入mySQL
IF (SELECT count(*) FROM myTable) = 1
//your SQL code here.
试试这个:
CREATE TABLE foo (x INT NOT NULL PRIMARY KEY CHECK (x = 1), col1 INT NOT NULL, col2 INT NOT NULL);
对您有两个建议,一个或两个建议可能有效,具体取决于您试图存储的数据的详细信息:
- 查看枚举或集合约束是否适用于您;请注意,它们基于SQL模式提供了不同的强制级别(例如,严格)。请参阅更多信息:
- 实现INSERT、UPDATE和DELETE触发器以控制对数据的访问(您可能希望在创建这些触发器之前先填充数据;同样,这取决于您的场景)
最简单的方法是创建一个只有一个合法值的列,然后将其声明为
NOTNULL unique
这将强制表中的行数不超过一行,但仍允许零行。如果需要防止删除唯一的行,请使用不同答案中给出的触发器方法
create table example(
enforce_one_row enum('only') not null unique default 'only',
... your columns ....
);
似乎正如MySQL参考手册所说:“CHECK子句被所有存储引擎解析但忽略了。”benjisail,你是对的。MySQL很烂。但它将在所有其他主要的DBMS中工作。我对触发器是新手。。。你能给我一个触发器的例子,它可以停止特定表上的所有插入、更新和删除操作吗?请查看BTW中指定的解决方法,记住你也可以编写一个AFTER触发器来“清理”坏数据。理想情况下,约束首先会阻止数据进入表中,但当您遇到我上面描述的限制时(我承认触发器不能满足所有需求),您可能会在事后采取“清理”方法。此外,如果你需要确保只有表中只有一行供读者使用,那么你就可以在基表中创建一个视图来防止你不想要的数据显示,这样你可以获得更多的灵活性。如果你问我,请考虑增加一些解释为什么这是正确的解决方案和你正在做什么:一个更好的解决方案。您没有使用触发器拦截事件,而是对UND进行建模
CREATE TABLE `myTable` (
`id` enum('1') NOT NULL,
`MyValue1` int(6) DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='The ENUM(''1'') construct as primary key is used to prevent that more than one row can be entered to the table';
create table example(
enforce_one_row enum('only') not null unique default 'only',
... your columns ....
);