SQL Query更新部门

时间:2014-12-02 09:12:05

标签: sql sql-server stored-procedures

我有一个特殊的方案来更新我的部门,而不会与现有记录发生任何冲突。

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

这是我的需要。

Dept

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

现在,我想更新其中一条现有记录,并确保它不应允许重复(deptiddeptname和两者都有。

前:

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

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

3 个答案:

答案 0 :(得分: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强制执行此操作。

答案 1 :(得分:0)

AS @mxix指出,一个独特的CONSTRAINT将阻止你添加重复项(你应该添加它们),但如果你尝试,它会给你一个错误信息。如果您尝试添加现有值

,则此查询无效
INSERT INTO Dept(DeptID)
SELECT 'ANewValue' 
WHERE 'ANewValue' NOT IN (SELECT DeptId FROM Dept)

答案 2 :(得分: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)