更改 table a 中的值也更改 table b 中的值
change value in table a also change in table b
Table一个
CREATE TABLE A
(
x character varying(50) NOT NULL,
y character varying(50) NOT NULL,
CONSTRAINT A_pkey PRIMARY KEY (x)
)
TABLE 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 的值改变 n table A,它也会在 table B 中改变。
我不确定我是否做对了,或者我是否应该为此类操作创建触发器?
因为现在,当我更改 table A 中 x 的值时,它不会更改 table B 中 x 的值。
了解情况很有趣。因此,原因是外键选项中的 MATCH 子句。正如文档所说,MATCH 导致 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
Table一个
CREATE TABLE A
(
x character varying(50) NOT NULL,
y character varying(50) NOT NULL,
CONSTRAINT A_pkey PRIMARY KEY (x)
)
TABLE 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 的值改变 n table A,它也会在 table B 中改变。 我不确定我是否做对了,或者我是否应该为此类操作创建触发器?
因为现在,当我更改 table A 中 x 的值时,它不会更改 table B 中 x 的值。
了解情况很有趣。因此,原因是外键选项中的 MATCH 子句。正如文档所说,MATCH 导致 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