表A

CREATE TABLE A
(
    x character varying(50) NOT NULL,
    y character varying(50) NOT NULL,
    CONSTRAINT A_pkey PRIMARY KEY (x)
)

表B
CREATE TABLE B
(
    x character varying(50) NOT NULL,
    z character varying(50) NOT NULL,
    w character varying(50) NOT NULL,
    CONSTRAINT B_pkey PRIMARY KEY (x,z),
    CONSTRAINT B_fkey FOREIGN KEY (x)
       REFERENCES A (x) MATCH SIMPLE
       ON UPDATE CASCADE ON DELETE CASCADE
)

问题:
这里的目标是,如果x的值在表A中改变了n,那么它在表B中也会改变。
我不确定我做得是否正确,或者我是否应该为这些行为创建触发器?
因为现在,当我改变表a中x的值时,它不会改变表B中x的值。

最佳答案

了解情况很有意思。所以,原因是外键选项中有一个匹配子句。如文档所述,匹配将导致忽略ON DELETE和ON UPDATE子句。
更多信息请点击-Using FOREIGN KEY Constraints
作为解决方案-不使用MATCH SIMPLE子句重新创建外键。
代码示例-

CREATE TABLE a (
  x VARCHAR(50) NOT NULL,
  y VARCHAR(50) NOT NULL,
  PRIMARY KEY (x)
)
ENGINE = INNODB;

CREATE TABLE b (
  x VARCHAR(50) NOT NULL,
  z VARCHAR(50) NOT NULL,
  w VARCHAR(50) NOT NULL,
  PRIMARY KEY (x, z),
  CONSTRAINT B_fkey FOREIGN KEY (x)
    REFERENCES a(x) ON DELETE CASCADE ON UPDATE CASCADE
)
ENGINE = INNODB;

INSERT INTO a VALUES
('1', '1'),
('2', '2');

INSERT INTO b VALUES
('1', '1', '1'),
('1', '2', '2'),
('2', '2', '2');

UPDATE a SET x = 33 WHERE x = 1;

SELECT * FROM b;

x   z   w
2   2   2
33  1   1
33  2   2

09-07 10:04