首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLite:确保一个条目比另一个条目更小作为约束

SQLite:确保一个条目比另一个条目更小作为约束
EN

Stack Overflow用户
提问于 2011-10-23 14:25:52
回答 1查看 218关注 0票数 1

我想知道如何解决这个问题。

我有两张桌子

Table1 ( t1_prim ,t1_int),以t1_prim为主键,t1_int null。

Table2 ( t2_prim1 t2prim2,t2_int),以t2_prim1和t2_prim2作为主密钥,外键约束t2_prim1引用t1_prim。

如何定义约束,以确保没有人在t2_int中输入大于t1_int中相应条目的整数?

我尝试过这样做(由于无法在check约束中输入子查询,所以无法工作):

代码语言:javascript
复制
CREATE TABLE table2 
  (t2_prim1 TEXT,
  t2_prim2 INTEGER,
  t2_int INTEGER NOT NULL,
  PRIMARY KEY (t2_prim1, t2_prim2),
  FOREIGN KEY (t2_prim1) REFERENCES table1(t1_prim),
  CHECK (t2_int2 <= (SELECT t1_int2 FROM table1 WHERE t1_int1=t2_int1)));

我认为如果它能像这样工作的话,还有另外一个问题。如何检查,当更改t1_int时,该约束是否已完全填充?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-29 14:42:37

终于找到了我问题的答案。您可以通过使用触发器来解决问题。下面是一个有用的例子:

代码语言:javascript
复制
CREATE TABLE table1
  (t1_prim TEXT PRIMARY KEY,
   t1_int INTEGER NOT NULL);

CREATE TABLE table2
  (t2_prim1 TEXT,
  t2_prim2 INTEGER,
  t2_int INTEGER NOT NULL,
  PRIMARY KEY (t2_prim1, t2_prim2),
  FOREIGN KEY (t2_prim1) REFERENCES table1(t1_prim));

创建用于更新和插入的触发器:

代码语言:javascript
复制
CREATE TRIGGER t1_int_update_constraint
BEFORE UPDATE OF t1_int ON table1
  BEGIN
    SELECT CASE 
      WHEN new.t1_int < (SELECT max(t2_int) FROM table2 WHERE t2_prim1=old.t1_prim) 
        THEN (SELECT RAISE(ABORT, 
          'Input smaller than maximum of all values for t2_int in database!'))
      END;
  END;

CREATE TRIGGER t2_int_update_constraint
BEFORE UPDATE OF t2_int ON table2
  BEGIN
    SELECT CASE 
      WHEN new.t2_int > (SELECT t1_int FROM table1 WHERE t1_prim=old.t2_prim1) 
        THEN (SELECT RAISE(ABORT, 
         'Input bigger than value in t1_int!'))
      END;
    END;

CREATE TRIGGER t2_int_insert_constraint
BEFORE INSERT ON table2
  BEGIN
    SELECT CASE 
      WHEN new.t2_int > (SELECT t1_int FROM table1 WHERE t1_prim=new.t2_prim1) 
        THEN (SELECT RAISE(ABORT, 
         'Input bigger than value in t1_int!'))
      END;
  END;

如果现在有以下表格:

table1

代码语言:javascript
复制
t1_prim     t1_int
----------  ----------
one         5         
two         10   

table2

代码语言:javascript
复制
t2_prim1    t2_prim2    t2_int    
----------  ----------  ----------
one         1           5         
one         2           4         
two         1           7         
two         2           5         
two         3           1         

你可以得到这个输出:

代码语言:javascript
复制
UPDATE table1 SET t1_int=4 WHERE t1_prim='one';

错误:在数据库中输入t2_int的所有值小于最大值!

代码语言:javascript
复制
UPDATE table1 SET t1_int=6 WHERE t1_prim='two';

错误:在数据库中输入t2_int的所有值小于最大值!

代码语言:javascript
复制
UPDATE table2 SET t2_int=8 WHERE t2_prim1='one' AND t2_prim2=1;

错误:在t1_int中输入大于值!

代码语言:javascript
复制
UPDATE table2 SET t2_int=11 WHERE t2_prim1='two' AND t2_prim2=2;

错误:在t1_int中输入大于值!

代码语言:javascript
复制
INSERT INTO table2 VALUES ('one', 3, 6);

错误:在t1_int中输入大于值!

虽然这些方法运作得很好:

代码语言:javascript
复制
INSERT INTO table2 VALUES ('one', 3, 6);
UPDATE table2 SET t2_int=1 WHERE t2_prim1='one' AND t2_prim2=1;
UPDATE table1 SET t1_int=8 WHERE t1_prim='two';
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7866686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档