我在SQL Server 2008 R2中有一个问答表。
问题:
q_id
question_text
答案:
a_id
question_text
answer_text
这显然是糟糕的设计。 question_text字段在Question
和Answer
表中重复,Answer
和Question
之间没有外键关系。我想通过查找Question
表中已存在的每个q_id
的{{1}}(Answer
)来创建此关系。我会通过将复制到Answer
表的question_text
值与Answer
表中的行相匹配来完成此操作。
这是我想用伪代码做的事情。
Question
表中创建一个可为空的q_id
字段(可以为空,因为Answer
表中已存在数据)Answer
表中选择所有内容。Answer
值,从Question
表中选择相应的问题。
- 将question_text
插入q_id
表q_id
列
Answer
中的q_id
列更改为不可为空。你能帮助我在SQL Server 2008 R2中实现这一目标吗?感谢。
PS:Answer
表中的所有question_text
值都是唯一的。
答案 0 :(得分:3)
第一步 - 创建新的q_id
列:
ALTER TABLE dbo.Answer ADD q_id INT NULL
第二步 - 根据question_text
UPDATE dbo.Answer
SET q_id = q.q_id
FROM dbo.Question q
WHERE dbo.Answer.question_text = q.question_text
第三步 - 如果您没有任何NULL值:
ALTER TABLE dbo.Answer ALTER COLUMN q_id INT NOT NULL
第四步 - 建立FK链接!
ALTER TABLE dbo.Answer
ADD CONSTRAINT FK_Answer_Question
FOREIGN KEY(q_id) REFERENCES dbo.Question(q_id)
第五步 - 删除旧question_text
列
ALTER TABLE dbo.Answer
DROP COLUMN question_text
当然 - 一如既往:
答案 1 :(得分:1)
尝试:
select a.a_id, q.q_id, a.answer_text
into NewAnswer
from Answer a, Question q
where a.question_text = q.question_text;
完成后,在NewAnswer
上添加约束,将Answer
重命名为其他内容,将NewAnswer
重命名为Answer
。
[编辑:修复语法,根据this link]