更新:可能是要使用Create Table和Alter Table中详细列出的检查表达式.@H_419_2@
更新:我正在查看可用的functions.@H_419_2@
更新:只是为了背景,这里是我正在使用的Rails验证逻辑:@H_419_2@
valIDate :multi_column_valIDationdef 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") endend
要清楚,我正在寻找Psql,而不是Ruby.我只想显示我使用的逻辑,因为它比枚举所有“真值表”的可能性更紧凑.@H_419_2@ 我认为最干净和一般的解决方案是创建一个函数来计算一些参数的空值.为此,您可以使用 pseudo-type anyarray
和类似的sql函数:
CREATE FUNCTION count_not_nulls(p_array anyarray)RETURNS BIGINT AS$$ SELECT count(x) FROM unnest() AS x$$LANGUAGE sql IMMUtable;
使用该功能,您可以将您的CHECK CONSTRAINT创建为:@H_419_2@
ALTER table your_tableADD chk_only_one_is_not_null CHECK(count_not_nulls(array[col1,col2,col3]) = 1);
只有当列的数据类型相同时,这才有效.如果不是这样,你可以把它们作为例子的文本(因为你只是关心null的情况):@H_419_2@
ALTER table your_tableADD chk_only_one_is_not_null CHECK(count_not_nulls(array[col1::text,col2::text,col3::text]) = 1);
由@muistooshort记住,您可以使用variadic arguments创建功能,可以清楚地调用:@H_419_2@
CREATE FUNCTION count_not_nulls(variadic p_array anyarray)RETURNS BIGINT AS$$ SELECT count(x) FROM unnest() AS x$$LANGUAGE sql IMMUtable;ALTER table your_tableADD chk_only_one_is_not_null CHECK(count_not_nulls(col1,col3) = 1);总结
以上是内存溢出为你收集整理的postgresql – Postgres约束确保许多的一列存在?全部内容,希望文章能够帮你解决postgresql – Postgres约束确保许多的一列存在?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)