0

我有 2 张桌子:

表 A:

AID
1
2
3
4

表 B:

BID AID Status
1   1   Open
2   2   Open
3   3   Closed
4   1   Open - don't allow this row until AID 1 Status changes to closed
5   2   Open - don't allow this row until AID 2 Status changes to closed
6   3   Open - allow this row because AId 3 Status is closed
7   3   Open - don't allow this row until AID 3 Status changes to closed

如何约束在 B 表中添加另一行,直到我将 AID 的状态更改为已关闭。或者我应该将状态列移动到 A 表?但即便如此,我如何在 B 表中检查 A 行的状态?

4

1 回答 1

0

通过演示:

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(BID SERIAL PRIMARY KEY
,AID INT NOT NULL
,Status VARCHAR(12) NOT NULL
);

INSERT INTO my_table VALUES
(1,1,'Open'),
(2,2,'Open'),
(3,3,'Closed');

SELECT * FROM my_table;
+-----+-----+--------+
| BID | AID | Status |
+-----+-----+--------+
|   1 |   1 | Open   |
|   2 |   2 | Open   |
|   3 |   3 | Closed |
+-----+-----+--------+

INSERT INTO my_table (aid,status) 
SELECT 1
     , 'Open' 
  FROM (SELECT 1) x 
  LEFT 
  JOIN 
     ( SELECT a.* 
         FROM my_table a 
         JOIN 
            ( SELECT aid
                   , MAX(bid) bid 
                FROM my_table 
               GROUP  
                  BY aid
            ) b
           ON b.aid = a.aid
          AND b.bid = a.bid
      ) y
     ON y.aid = 1
    AND y.status = 'Open'
  WHERE y.bid IS NULL;

+-----+-----+--------+
| BID | AID | Status |
+-----+-----+--------+
|   1 |   1 | Open   |
|   2 |   2 | Open   |
|   3 |   3 | Closed |
+-----+-----+--------

INSERT INTO my_table (aid,status) VALUES
(1,'Closed');

SELECT * FROM my_table;
+-----+-----+--------+
| BID | AID | Status |
+-----+-----+--------+
|   1 |   1 | Open   |
|   2 |   2 | Open   |
|   3 |   3 | Closed |
|   4 |   1 | Closed |
+-----+-----+--------+

INSERT INTO my_table (aid,status) 
SELECT 1
     , 'Open' 
  FROM (SELECT 1) x 
  LEFT 
  JOIN 
     ( SELECT a.* 
         FROM my_table a 
         JOIN 
            ( SELECT aid
                   , MAX(bid) bid 
                FROM my_table 
               GROUP  
                  BY aid
            ) b
           ON b.aid = a.aid
          AND b.bid = a.bid
      ) y
     ON y.aid = 1
    AND y.status = 'Open'
  WHERE y.bid IS NULL;

SELECT * FROM my_table;
+-----+-----+--------+
| BID | AID | Status |
+-----+-----+--------+
|   1 |   1 | Open   |
|   2 |   2 | Open   |
|   3 |   3 | Closed |
|   4 |   1 | Closed |
|   5 |   1 | Open   |
+-----+-----+--------+
于 2018-06-23T09:40:02.593 回答