MySQL:如何防止插入所有列= NULL的行?
在我的 MySQL 表中,每一列本身都可以为 NULL,但必须至少有一列具有非 NULL 值。目前,我正在存储过程中包装一条插入语句,以防止插入全 NULL 行,但这当然不会阻止任何人使用本机 INSERT 语句,从而绕过我的包装程序。
是否有一种“本机”方法来定义具有该约束的表?
In my MySQL table, every column by itself can be NULL, but there must be at least one column with a non-NULL value. At the moment, I am wrapping an insert statement in a stored procedure which prevents insertion of all-NULL rows, but that of course does not keep anyone from using native INSERT statements, circumventing my wrapper procedure.
Is there a 'native' way to define the table with that constraint ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
仅授予执行权限,以便用户或您的应用程序用户只能调用存储过程!
grant execute permissions only so users or your application user can only call stored procs !
由于 MySQL 不强制执行检查约束,因此您可能需要使用触发器来模拟检查约束。我建议查看这篇 MySQL Forge 文章:
这个想法是这样的将您的检查逻辑移至触发器。如果检查失败,则调用因引发唯一键违规而失败的存储过程。这允许我们向客户端返回一条描述性错误消息。
您的触发器可能如下所示:
我们需要使
fail
存储过程引发唯一的键违规,以便在检查失败时中止INSERT
。上面提到的文章建议创建一个定义如下的内存表:然后,
fail
存储过程可以实现如下:双
INSERT
将确保引发唯一键违规。如果表中已存在相同的消息,则在第一次INSERT
时将引发违规,但只要失败就没有关系。我们可以从命令行尝试
fail
存储过程:好消息是我们收到了一条可读的错误消息。但是,我们没有返回正确的错误代码,并且我们实际上没有“重复条目”。这显然是该方法的一个限制,特别是在使用错误处理的过程中更新或插入记录时,特别是专门处理
1062 Duplicate Entry
错误。Since MySQL doesn't enforce check constraints, you may want to emulate one with a trigger. I suggest checking out this MySQL Forge article:
The idea is this to move your check logic to a trigger. If the check fails, call a stored procedure that fails by raising a unique key violation. This allows us to return a descriptive error message back to the client.
Your trigger will probably look something like this:
We need to make the
fail
sproc raise a unique key violation in order to have theINSERT
aborted when the check fails. The above mentioned article suggests creating a memory table defined as follows:Then the
fail
sproc could be implemented as follows:The double
INSERT
will ensure that the unique key violation is raised. If the same message already exists in the table, the violation will get raised on the firstINSERT
, but it doesn't matter as long as it fails.We can try the
fail
sproc from the command line:The good news is that we get back a readable error message. However we don't get back the correct error code, and we don't really have a "duplicate entry". This is obviously one limitation of this method, especially when updating or inserting records in a procedure which uses error handling, in particular handling the
1062 Duplicate Entry
error specifically.添加简单的检查约束
更新:
发现mysql不支持检查约束(解析,但忽略),一种可能的解决方法:使用触发器(查看http://db4free.blogspot.com/2006/01/emulated-check-constraints.html)
add simple check constraint
UPDATE:
Found that mysql does not support check constraint (parse, but ignore), one is possible workaround: using trigger (look to http://db4free.blogspot.com/2006/01/emulating-check-constraints.html)