我正在实施和设计我的第一个数据库,并且有很多包含名称和地址等的列。
对这些列施加约束似乎是合乎逻辑的,CHECK
这样 DB 只接受来自字母数字范围的值(不允许任何特殊字符)。
我正在使用 MySQL,据我所知它不支持用户定义的类型,有没有简单的方法可以做到这一点?
防止不良数据进入数据库似乎是值得的,但是是否应该将这种复杂的检查转移到应用程序中呢?
我正在实施和设计我的第一个数据库,并且有很多包含名称和地址等的列。
对这些列施加约束似乎是合乎逻辑的,CHECK
这样 DB 只接受来自字母数字范围的值(不允许任何特殊字符)。
我正在使用 MySQL,据我所知它不支持用户定义的类型,有没有简单的方法可以做到这一点?
防止不良数据进入数据库似乎是值得的,但是是否应该将这种复杂的检查转移到应用程序中呢?
如果您使用的是 mysql ,则不能使用 CHECK 约束来执行此操作(问题被标记为mysql,所以我认为是这种情况)- mysql 不支持检查约束。它们在语法中是允许的(与来自其他数据库的 DDL 兼容),但在其他方面被忽略。
您可以将触发器添加到在插入和更新时触发的表中,以检查数据的合规性,但是如果您发现问题,则无法从 mysql 存储过程中引发异常。
我使用了一种解决方法,即点击一个不存在的表,但其名称可以传达您想要的含义,例如
update invalid_characters set col1 = 1;
并希望阅读“table invalid_characters 不存在”消息的人明白这一点。
有几个设置允许您更改 MySQL 如何处理特定情况(但这些还不够)。
我会坚持在应用程序端进行数据验证,但如果您需要在数据库端进行验证,您有两种选择:
CREATE PROCEDURE
这将验证和插入数据,什么都不做或通过调用引发错误SIGNAL
CREATE TRIGGER ... BEFORE INSERT
这将验证数据并停止插入,就像这个stackoverflow 答案中建议的那样