我有一个此处指定的教育表,它引用了程序和用户表。
这两个表的重要部分就是键program_id和user_id。
CREATE TABLE Education(
user_id INTEGER NOT NULL,
program_id INTEGER NOT NULL,
FOREIGN KEY (program_id) REFERENCES Programs,
PRIMARY KEY (user_id),
FOREIGN KEY(user_id) REFERENCES Users,
program_year INTEGER NOT NULL
);
我尝试将另一个表合并到这个表中,如下所示:
MERGE INTO Education e
USING (SELECT u.user_id, p.program_id, u.program_year
FROM project1.Public_User_Information u,
Programs p
WHERE p.institution = u.institution_name
AND p.concentration = u.program_concentration
AND p.degree = u.program_degree
) d
ON (e.user_id = d.user_id)
WHEN NOT MATCHED THEN
INSERT (user_id, program_id, program_year)
VALUES (d.user_id, d.program_id, d.program_year);
WHERE 语句的想法是从 Programs 中获取与相应机构名称、浓度和项目学位相匹配的 program_id。
然后,我检查重复的键 user_id,如果不匹配,则插入一个新条目。
但是,我不断收到错误,表明此合并违反了唯一约束。
我做错了什么吗? 非常感谢!
确保您的
SELECT
语句不会为每个 user_id
返回多行。
例如:
CREATE TABLE programs (
program_id INTEGER PRIMARY KEY,
institution VARCHAR2(20),
concentration VARCHAR2(20),
degree VARCHAR2(20)
);
CREATE TABLE users (
user_id INTEGER PRIMARY KEY
);
CREATE TABLE /*project1.*/Public_User_Information (
user_id INTEGER,
program_year INTEGER,
institution_name VARCHAR2(20),
program_concentration VARCHAR2(20),
program_degree VARCHAR2(20)
);
CREATE TABLE Education(
user_id INTEGER NOT NULL,
program_id INTEGER NOT NULL,
FOREIGN KEY (program_id) REFERENCES Programs,
PRIMARY KEY (user_id),
FOREIGN KEY(user_id) REFERENCES Users,
program_year INTEGER NOT NULL
);
INSERT ALL
INTO programs (program_id, institution, concentration, degree)
VALUES (1, 'A', 'B', 'C')
INTO users (user_id) VALUES (1)
INTO /*project1.*/Public_User_Information (user_id, program_year, institution_name, program_concentration, program_degree)
VALUES (1, 1970, 'A', 'B', 'C')
INTO /*project1.*/Public_User_Information (user_id, program_year, institution_name, program_concentration, program_degree)
VALUES (1, 1971, 'A', 'B', 'C')
SELECT * FROM DUAL;
然后:
MERGE INTO Education e
USING (SELECT u.user_id, p.program_id, u.program_year
FROM /*project1.*/Public_User_Information u,
Programs p
WHERE p.institution = u.institution_name
AND p.concentration = u.program_concentration
AND p.degree = u.program_degree
) d
ON (e.user_id = d.user_id)
WHEN NOT MATCHED THEN
INSERT (user_id, program_id, program_year)
VALUES (d.user_id, d.program_id, d.program_year);
输出:
ORA-00001: unique constraint (FIDDLE_MPWPWTLRQFOVUMVRIBPO.SYS_C00104416) violated
如:
SELECT u.user_id, p.program_id, u.program_year
FROM /*project1.*/Public_User_Information u,
Programs p
WHERE p.institution = u.institution_name
AND p.concentration = u.program_concentration
AND p.degree = u.program_degree
同一行输出多行
user_id
:
用户ID | 程序_ID | PROGRAM_YEAR |
---|---|---|
1 | 1 | 1970 |
1 | 1 | 1971 |