Mysql 关联表中类似于此的外键的约束?
有三个表A、B、C,列src是表A和B中的外键。表是A.ID和B.ID的关联表 mysql中是否有任何约束来确保插入表C的每一行都必须遵循约束:A.src等于B.src作为其ID 例如,在下表C中,Mysql 关联表中类似于此的外键的约束?,mysql,sql,oracle,Mysql,Sql,Oracle,有三个表A、B、C,列src是表A和B中的外键。表是A.ID和B.ID的关联表 mysql中是否有任何约束来确保插入表C的每一行都必须遵循约束:A.src等于B.src作为其ID 例如,在下表C中,第17行是允许的,因为A.ID和B.ID的SRC都是35,但是第27行是非法的,因为A.ID的SRC是46,而B.ID的SRC是35。 Table A ID SRC 1 35 2 46 3 46 Table B ID SRC 6 46 7 35 8 46 Table C
第17行
是允许的,因为A.ID和B.ID的SRC都是35,但是第27行
是非法的,因为A.ID的SRC是46,而B.ID的SRC是35。
Table A
ID SRC
1 35
2 46
3 46
Table B
ID SRC
6 46
7 35
8 46
Table C
A_ID B_ID
1 7
3 6
是否可以设置任何约束或机制来确保插入表C的每一行都遵循规则
谢谢。我不确定,但我试过了
INSERT INTO table_c
(SELECT
a.ID,
b.ID
FROM
table_a AS a INNER JOIN table_b AS b ON a.SRC = b.SRC
);
我可以将ID从表a和表b插入表c您可以在Oracle中使用物化视图执行此操作: Oracle安装程序:
CREATE TABLE A (
ID NUMBER PRIMARY KEY,
SRC NUMBER
);
CREATE TABLE B (
ID NUMBER PRIMARY KEY,
SRC NUMBER
);
CREATE MATERIALIZED VIEW LOG ON A
WITH SEQUENCE, ROWID(id, src)
INCLUDING NEW VALUES;
CREATE MATERIALIZED VIEW LOG ON B
WITH SEQUENCE, ROWID(id, src)
INCLUDING NEW VALUES;
CREATE MATERIALIZED VIEW AB_MV
BUILD IMMEDIATE
REFRESH FAST ON COMMIT
AS SELECT a.id, b.id
FROM a, b
WHERE a.src = b.src
GROUP BY A.id, B.id;
ALTER TABLE AB_MV ADD CONSTRAINT AB_MV__A__B__PK PRIMARY KEY (A_ID, B_ID );
CREATE TABLE C (
A_ID NUMBER REFERENCES A( ID ),
B_ID NUMBER REFERENCES B( ID ),
PRIMARY KEY ( A_ID, B_ID ),
FOREIGN KEY ( A_ID, B_ID ) REFERENCES AB_MV ( A_ID, B_ID )
);
INSERT INTO A
SELECT 1, 35 FROM DUAL UNION ALL
SELECT 2, 46 FROM DUAL UNION ALL
SELECT 3, 46 FROM DUAL;
INSERT INTO B
SELECT 7, 35 FROM DUAL UNION ALL
SELECT 6, 46 FROM DUAL UNION ALL
SELECT 8, 46 FROM DUAL;
SELECT * FROM AB_MV;
-- Will return zero rows as there has not been a commit.
COMMIT;
SELECT * FROM AB_MV;
-- Will return 5 rows.
INSERT INTO C VALUES ( 1, 7 );
-- 1 row inserted
INSERT INTO C VALUES ( 2, 7 );
-- Fails with ORA-02291: Integrity constraint violated - parent key not found.
插入数据:
CREATE TABLE A (
ID NUMBER PRIMARY KEY,
SRC NUMBER
);
CREATE TABLE B (
ID NUMBER PRIMARY KEY,
SRC NUMBER
);
CREATE MATERIALIZED VIEW LOG ON A
WITH SEQUENCE, ROWID(id, src)
INCLUDING NEW VALUES;
CREATE MATERIALIZED VIEW LOG ON B
WITH SEQUENCE, ROWID(id, src)
INCLUDING NEW VALUES;
CREATE MATERIALIZED VIEW AB_MV
BUILD IMMEDIATE
REFRESH FAST ON COMMIT
AS SELECT a.id, b.id
FROM a, b
WHERE a.src = b.src
GROUP BY A.id, B.id;
ALTER TABLE AB_MV ADD CONSTRAINT AB_MV__A__B__PK PRIMARY KEY (A_ID, B_ID );
CREATE TABLE C (
A_ID NUMBER REFERENCES A( ID ),
B_ID NUMBER REFERENCES B( ID ),
PRIMARY KEY ( A_ID, B_ID ),
FOREIGN KEY ( A_ID, B_ID ) REFERENCES AB_MV ( A_ID, B_ID )
);
INSERT INTO A
SELECT 1, 35 FROM DUAL UNION ALL
SELECT 2, 46 FROM DUAL UNION ALL
SELECT 3, 46 FROM DUAL;
INSERT INTO B
SELECT 7, 35 FROM DUAL UNION ALL
SELECT 6, 46 FROM DUAL UNION ALL
SELECT 8, 46 FROM DUAL;
SELECT * FROM AB_MV;
-- Will return zero rows as there has not been a commit.
COMMIT;
SELECT * FROM AB_MV;
-- Will return 5 rows.
INSERT INTO C VALUES ( 1, 7 );
-- 1 row inserted
INSERT INTO C VALUES ( 2, 7 );
-- Fails with ORA-02291: Integrity constraint violated - parent key not found.
您可能可以在MySQL中使用触发器来填充
AB_MV
表(使用合并到
以实现唯一性),尽管从a
或B
删除行的触发器可能很有趣,因为ID
对可以来自多个SRC
值,MySQL和RDB,这是一个非常罕见的组合。。。你真的在使用所有这些产品吗?我不认为这很少见,我现在使用的是mysql,以前使用过Oracle,我还对其他关系数据库中是否存在约束感兴趣。不要只是为了防止标签产品不直接涉及。。。标记您面对问题使用的dbms产品。您可能已经注意到MySQL的约束处理与Oracle有点不同……是的,您是对的,MySQL是重点关注的,我知道dbms之间的约束是不同的。谢谢你的建议。我还是不明白,你说表c
必须遵循约束:A.src等于B.src代表他们的ID。但是你也说第27行
是非法的,因为A.ID的src是46,而B.ID的src是35。如果您看到第36行
都有相同的SRC,这意味着表C
中应该有第38行
,第26行
和第28行
,对吗?虽然这会得到可接受的值并将它们插入表中,但它完全没有抓住问题的关键,因为它没有强制要求只允许在两个表a
和b
中都有与具有相同src
的可接受对匹配的值。@MT0MTO@said, “它并没有强制要求只允许在表a和表b中存在与具有相同src的可接受对匹配的值”。@JTR实际上,如果所有可用对都签入,表C就没有什么意义,因为我可以通过连接b轻松获得它作为您的答案,对吗?@jjs是的,我想是的。我的错,对不起,忽略这个答案XD