2014-12-02 43 views
0

我有一个特殊的场景来更新我的部门,而不会与现有记录发生任何冲突。SQL查询更新部门

有人能告诉我如何为它编写查询吗?

这是我的需要。

Dept

DeptID    DeptName 
-----------------------------  
D001    Accounts 
D002    HR 
D003    Dev 
D004    Support 

现在,我想更新现有记录之一,并确保它不应该允许重复(无论是deptiddeptname两者)​​。

例:

  • 案例1:当我尝试更新D001,我不应该给DeptID像D002,D003或D004,因为它们已经存在。

  • 案例2:当我尝试编辑DeptName,它不应该接受任何现有DeptNames

+3

你应该在每一列创建一个唯一约束条件 – mxix 2014-12-02 09:13:01

+0

已经回答http://stackoverflow.com/questions/64981/sql-server-2005-how-create-a-unique-constraint – 2014-12-02 09:18:57

回答

0

AS @mxix指出,唯一性约束将防止重复添加的(你应该添加他们),但它会给你一个错误消息,如果你尝试。这里有一个查询,如果您尝试添加现有值

INSERT INTO Dept(DeptID) 
SELECT 'ANewValue' 
WHERE 'ANewValue' NOT IN (SELECT DeptId FROM Dept) 
0

检查的deptiddeptname的存及其然后插入值到dept表,什么也不做,

对于INSERT

IF NOT EXISTS(SELECT DeptID 
       FROM Dept 
       WHERE DeptID = 'D005' OR DeptName = 'maintanance') 
BEGIN 
    INSERT INTO Dept (DeptID, DeptName) VALUES ('D005', 'maintanance') 
END 

对于UPDATE

案例1:

UPDATE Dept 
SET DeptID = 'D005' 
WHERE DeptName = 'some name' AND DeptID NOT IN (SELECT DeptID FROM Dept) 

案例2:

UPDATE Dept 
SET DeptName = 'Some name' 
WHERE DeptID = 'some id' AND DeptName NOT IN (SELECT DeptName FROM Dept) 
+0

对于插入,这将工作。但我正在寻找更新 – jestges 2014-12-02 09:37:34

+0

@jestges:检查更新后的结果并回复状态。 – 2014-12-02 09:46:47

1

你会好起来的存储你的部门标识符作为INT /主键自动递增。这将关注ID的独特性。

ALTER TABLE Dept 
ADD DeptID int NOT NULL IDENTITY (1,1) PRIMARY KEY 

如果你真的想要的格式D001,在你的价值观,你可以在检索数据时补充一点:

SELECT DeptID, 
     'D' + RIGHT('000' + CAST(DeptID AS VARCHAR(3)), 3) 
FROM Dept 

然后你只需要担心的部门名称是唯一的。

与部门名称,首先你应该有防止添加重复值应用逻辑;其次,当你试图添加一个新的值,你可以执行检查:

DECLARE @DeptToAdd VARCHAR(20) = 'Cleaning' 

IF NOT EXISTS (SELECT 1 FROM Dept WHERE DeptName = @DeptToAdd) 
BEGIN 
-- INSERT CODE IF IT DOES NOT EXIST 
    INSERT INTO Dept (DeptName) 
    VALUES (@DeptToAdd) 
-- or UPDATE 
    UPDATE Dept 
    SET DeptName = @DeptToAdd 
    WHERE DeptId = 123 
END 

这只会插入或如果值不存在,请更新该值。

在此之上,您可以使用unique constraint执行此操作。