2014-12-02 76 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執行此操作。