我试图弄清楚如何实现下面描述的alter脚本。如果已经插入/选择,我熟悉基础知识,但这要复杂得多。
我有一个遗留表,需要将其数据移动到包含更多列的新表。新表已经公开给一些选择用户,他们可能已经手动移动了公共数据。
因此对于LegacyTable中的每一行:
我需要在MS SQL和Oracle中实现这一点,但是一旦我在逻辑上计算出逻辑,我就可以在另一个上找出语法。
答案 0 :(得分:0)
我确定的解决方案(在SQL Server中 - 仍然需要移植到Oracle):
IF NOT EXISTS(SELECT 1
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'NewImprovedTable'
AND COLUMN_NAME = 'legacyFlg')
BEGIN
ALTER TABLE [NewImprovedTable]
ADD legacyFlg TINYINT NULL
ALTER TABLE [LegacyTable]
ADD improvedId INT NULL
END
GO
IF NOT EXISTS(SELECT 1 FROM ImprovedTable WHERE legacyFlg = 1)
BEGIN
MERGE ImprovedTable AS TARGET
USING LegacyTable AS SOURCE
ON (TARGET.stringField = SOURCE.stringField)
WHEN NOT MATCHED THEN
INSERT (name, <other columns>, legacyFlg)
VALUES('Legacy' + SOURCE.stringField, <other column values>, 1)
WHEN MATCHED THEN
UPDATE SET TARGET.legacyFlg = 1;
END
GO
IF NOT EXISTS(SELECT 1 FROM LegacyTable WHERE improvedId <> 0)
BEGIN
MERGE LegacyTable AS TARGET
USING NewImprovedTable AS SOURCE
ON (SOURCE.stringField = TARGET.stringField)
WHEN MATCHED THEN
UPDATE SET TARGET.improvedId = SOURCE.pId;
END
GO
答案 1 :(得分:-1)
你可以试试这个,输入&#39;是您尝试确认的字符串是否已存在:
SELECT * FROM`NewImprovedTable` WHERE `Variable`='input'
如果找到任何匹配,这将返回整行,如果没有,它将返回null,你可以用那个
对于唯一ID字段,您需要使用自动增量选项启用在表上创建主键,例如
CREATE TABLE Persons
(
P_Id INT NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
)
在最后一个示例中,P_Id被设置为自动增量变量,每次创建一个新行时,它将使用唯一编号自动填充此列。 你应该看看这个页面