我对CHECK的语法有问题,特别是它与列一起出现的方式。一个具体的例子:

CREATE OR REPLACE FUNCTION greater_than_10(x INTEGER) RETURNS BOOLEAN AS
'SELECT $1>10;'
LANGUAGE SQL;

CREATE TABLE A (
    v1 INTEGER CHECK (greater_than_10(v1)),
    v2 INTEGER CHECK (greater_than_10(v2))
)

我的问题是:为什么CHECK必须出现在列旁边?如果它只显示在列旁边,那么传递参数是多余的,因为该列的值应该是隐式的。但是,以下语法同样正确:
CREATE TABLE A (
    v1 INTEGER CHECK (greater_than_10(v2)),
    v2 INTEGER CHECK (greater_than_10(v1))
)

这表明CHECK没有绑定到特定列,而是绑定到整行,并且可以使用其他行以及以下示例中的值:
CREATE OR REPLACE FUNCTION sum_more_than_10(x INTEGER, y INTEGER) RETURNS BOOLEAN AS
'SELECT $1+$2>10;'
LANGUAGE SQL;

CREATE TABLE A (
    v1 INTEGER CHECK (sum_more_than_10(v1, v2)),
    v2 INTEGER
)

在最后一种情况下,CHECK是出现在v1列上还是出现在v2列中没有区别。那么为什么CHECK在语法上绑定到一个列呢?我有什么遗漏吗?

最佳答案

CHECK约束中的表达式不必是单参数函数调用。不用调用greater_than_10函数,只需编写CHECK (v1 > 10)。或者你可以写CHECK (20 < (v1 * 2))。列名可以出现在表达式中的任何位置;它不隐含在任何特定的位置。
另外,列约束实际上只是表约束的语法糖。当你写作时

v1 INTEGER CHECK (v1 > 10),
v2 INTEGER CHECK (v2 > 10)

相当于写作
v1 INTEGER,
v2 INTEGER,
CHECK (v1 > 10),
CHECK (v2 > 10)

甚至可以将两者合并为一个约束:
v1 INTEGER,
v2 INTEGER,
CHECK ((v1 > 10) AND (v2 > 10))

关于sql - 掌握`CHECK`的语法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22133345/

10-15 18:32