SQL Server:如何规范化数据表?

时间:2013-04-23 18:28:19

标签: sql-server

我有一个包含3列的表,需要将其移动到另一个表中,并替换为另一个表中插入行的IdentityID。

Here是我尝试使用的基本思想的SQLFiddle:

CREATE TABLE RECORD 
(
  ID int,
  ObjectDetail_A int,
  ObjectDetail_B int,
  ObjectDetail_C int,
  ObjectDetailID int
)

CREATE TABLE OBJECTDETAIL
(
  ID int,
  ObjectDetail_A int,
  ObjectDetail_B int,
  ObjectDetail_C int
)

因此,当数据插入该表时,字段ObjectDetail_A,ObjectDetail_B和ObjectDetail_C将替换为OBJECTDETAIL表的ID。

我对如何将行插入目标表然后使用目标标识更新源表感到困惑。

非常感谢任何帮助,

由于

4 个答案:

答案 0 :(得分:1)

我想解决方案并不像我想象的那么复杂。

我做的是:

ALTER TABLE OBJECTDETAIL
ADD SourceID INT
GO

INSERT INTO ProductDetail (ObjectDetail_A, ObjectDetail_B, ObjectDetail_C, SourceID)
SELECT ObjectDetail_A, ObjectDetail_B, ObjectDetail_C, ID
FROM RECORD
GO

UPDATE RECORD
SET RECORD.ObjectDetailID = OBJECTDETAIL.ID
JOIN OBJECTDETAIL
ON RECORD.ID = OBJECTDETAIL.SourceID
GO

ALTER TABLE OBJECTDETAIL
DROP COLUMN SourceID
GO

这对我有用。感谢所有的回复。

答案 1 :(得分:0)

只要A,B和& C字段是唯一的,或者你可以使用相同的ObjectDetail.ID重复,然后你可以只插入它们,然后JOIN获取新的ID:

INSERT INTO ObjectDetail
  ( ObjectDetail_A, ObjectDetail_B, ObjectDetail_C )
SELECT DISTINCT ObjectDetail_A, ObjectDetail_B, ObjectDetail_C
FROM Record

UPDATE Record
SET ObjectDetailID = d.ID
FROM Record r
INNER JOIN ObjectDetail d
  ON r.ObjectDetail_A = d.ObjectDetail_A
  AND r.ObjectDetail_B = d.ObjectDetail_B
  AND r.ObjectDetail_C = d.ObjectDetail_C

答案 2 :(得分:0)

据我所知,你需要创建两个表..

 CREATE TABLE OBJECTDETAIL
    (
      ObjectDetailID int
      ObjectDetail_A int,
      ObjectDetail_B int,
      ObjectDetail_C int,
    PRIMARY KEY (ObjectDetailID),

    )
    CREATE TABLE RECORD 
    (
      ID int,
      ObjectDetailID int, 
      CONSTRAINT fk_objectdetail FOREIGN KEY (ObjectDetailID) REFERENCES OBJECTDETAIL(ObjectDetailID)
    )

通过这种方式,您可以先插入OBJECTDETAIL,然后使用插入的RECORD

插入ObjectDetailID

答案 3 :(得分:0)

将OBJECTDETAIL.ID设为自动增量IDENTITY字段。

INSERT INTO OBJECTDETAIL
( SELECT DISTINCT 
ObjectDetail_A,
ObjectDetail_B,
ObjectDetail_C
FROM RECORD )

然后更新RECORD.ObjectDetailID。

UPDATE R
SET R.ObjectDetailID = OD.ID
FROM RECORD R
JOIN OBJECTDETAIL OD
ON OD.ObjectDetail_A = R.ObjectDetail_A
AND OD.ObjectDetail_B = R.ObjectDetail_B
AND OD.ObjectDetail_C = R.ObjectDetail_C

RECORD.ObjectDetailID应该是一个外键字段,并且应该从表中删除RECORD.ObjectDetail_A等字段。