【问题标题】:Can I create a table with check constrain whose values are dependent on sql query我可以创建一个带有检查约束的表,其值取决于 sql 查询吗
【发布时间】:2010-06-08 10:18:08
【问题描述】:

是否可以创建一个表,该表对其中一个列具有检查约束,该列的值位于另一个 sql 查询给出的结果集中

例如。

create table tablename
(
name varchar(10),
rollno int
)check rollno in (select rollno from anotherDatabase.TableName,candidateRoll)

或任何类似的东西。

我不必在任何地方使用它但仍然想知道。

【问题讨论】:

    标签: sql sql-server constraints qtsql


    【解决方案1】:

    如果您无法使用外键引用实现您想要的,那么您可以将 SELECT 语句包装在函数调用中。

    您的检查约束表达式可能类似于:

    (dbo.SomeFunction([col1]) != 0)
    

    函数可能如下所示(假设列是 varchar):

    create function dbo.SomeFunction(@arg varchar(max))
    returns bit
    as
    begin
    return
    (
        select count(*) from SomeOthertable where col2 = @arg
    )
    end
    

    编辑(2010/06/9):关于 Anthony 的评论,我的测试表明大于 1 的 count(*) 值仍然返回为 1。所以看起来函数没关系,即使它可能应该显式返回 1 或 0。或者,如果您对实际行数感兴趣,请将返回类型从 BIT 更改为 INT。

    【讨论】:

    • 很好的解决方案。从 int 到 bit 的隐式转换有点吓人,如果 COUNT(*) > 1 会发生什么?
    • 是的,好点。到目前为止,我只在主键上使用了这种方法,所以 COUNT(*) > 1 的可能性为零。
    【解决方案2】:

    是:相同数据库链接的外键

    create table tablename
    (
    name varchar(10),
    rollno int FOREIGN KEY (candidateRoll) REFERENCES OtherTableName (candidateRoll)
    )
    

    如果是不同的数据库,则使用代码,例如通过存储过程插入或通过触发器强制执行

    【讨论】:

    • 但是不能应用跨库关系
    • @Madhivanan:严格来说,没有所谓的“跨数据库关系”。如果它是相关的,它是同一个数据库。我也提到了这个场景的触发器和存储过程
    猜你喜欢
    • 2020-09-28
    • 1970-01-01
    • 2020-12-03
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多