Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何确保DB表中只有一行?_Mysql_Database_Database Design_Privileges - Fatal编程技术网

Mysql 如何确保DB表中只有一行?

Mysql 如何确保DB表中只有一行?,mysql,database,database-design,privileges,Mysql,Database,Database Design,Privileges,我希望确保名为“myTable”的MySQL表只有一行 所以我需要能够更新这一行,但显然插入和删除应该是不可能的 我问这个问题是因为这个 谢谢 您可以使用表权限(假设一旦您将相关权限设置为阻止插入/删除,并且您不应该再更新权限,但是,任何拥有该权限的用户都可以再次覆盖该权限) 首先插入一条且仅一条记录 然后通过在列表_priv中禁用插入、更新、删除来添加权限 mysql> desc tables_priv; +-------------+-----------------------------

我希望确保名为“myTable”的MySQL表只有一行

所以我需要能够更新这一行,但显然插入和删除应该是不可能的

我问这个问题是因为这个


谢谢

您可以使用表权限(假设一旦您将相关权限设置为阻止插入/删除,并且您不应该再更新权限,但是,任何拥有该权限的用户都可以再次覆盖该权限)

首先插入一条且仅一条记录 然后通过在列表_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触发器以控制对数据的访问(您可能希望在创建这些触发器之前先填充数据;同样,这取决于您的场景)


如果数据库设置为“严格”模式,则可以创建如下表:

创建表foo(id enum('SYSROW')不为null,(其他列定义)主键(id))

如果myTable不存在,则创建表( ID int不为空 )引擎=innodb; 选择“创建触发器tbi_myTable”; 如果存在触发,则触发触发tbi_myTable; 分隔符// 创建触发器tbi_myTable 在myTable上插入之前 每行 开始 如果(从myTable中选择计数(1)>0,则 --信号仅在5.6及以上使用另一种方式引发错误:如果小于5.6 信号SQLSTATE“50000”设置消息_TEXT=“无法在myTable中插入仅有一行!”; 如果结束; 结束// 定界符; 插入myTable值(1); --这将产生一个错误 插入myTable值(2); --这将只有一行带有“1” 从myTable中选择*;
最简单的方法是创建一个只有一个合法值的列,然后将其声明为
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 ....
);