Mysql 关联表中类似于此的外键的约束?

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

有三个表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
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