向PostgreSQL添加约束以检查一列(来自一组列)是否包含非空值的好方法是什么?
更新:我可能想要使用Create Table和Alter Table中check详细说明的表达式.
更新:我正在查看可用的功能.
更新:仅供后台使用,这是我目前正在使用的Rails验证逻辑:
validate :multi_column_validation
def multi_column_validation
n = 0
n += 1 if column_1
n += 1 if column_2
n += 1 if column_3
unless 1 == n
errors.add(:base, "Exactly one column from " +
"column_1, column_2, column_3 must be present")
end
end
Run Code Online (Sandbox Code Playgroud)
要清楚,我在这里寻找的是PSQL,而不是Ruby.我只想展示我正在使用的逻辑,因为它比枚举所有"真值表"的可能性更紧凑.
我有一个 SQLAlchemy 模型,其中有一个从 HTML 表单填充的整数列(我正在使用 Flask 和 WTForms-alchemy,并且我试图避免在路由中编写自定义代码)。如果用户没有在表单上输入该整数的值,则从表单填充对象的代码最终会尝试为该列放入一个空字符串,并且 MySQL 会抱怨这不是一个整数值。为了帮助人们搜索:我开始遇到的错误Incorrect integer value: '' for column ...。
我不想使用sql_mode=''hack,人们建议这样做是为了让 MySQL 回到旧的行为,每当你给它不正确的数据时就进行猜测,因为我无法控制最终将使用的 MySQL 服务器。
我想要的是类似于默认列规范的东西,除了在没有任何内容传入时指定默认值,我想拦截尝试放入空字符串并将其替换为 None ,我认为这会被转换为当它进入数据库时为 null。
有没有办法在模型定义中做到这一点?我意识到这可能会导致性能下降,但吞吐量在此应用程序中并不是什么大问题。
我有两个字段:
class Person(base):
field1 = Column(String(32), unique=True, nullable=True)
field2 = Column(String(128), unique=True, nullable=True)
field3 = ...
...
Run Code Online (Sandbox Code Playgroud)
我需要创建一个约束,以检查是否至少有一个[field1, field2]可用。我想我需要使用CheckConstraint,但我没有得到结果。有任何想法吗?