我有一个特殊的方案来更新我的部门,而不会与现有记录发生任何冲突。
有人可以告诉我如何为它编写查询吗?
这是我的需要。
表Dept
:
DeptID DeptName
-----------------------------
D001 Accounts
D002 HR
D003 Dev
D004 Support
现在,我想更新其中一条现有记录,并确保它不应允许重复(deptid
或deptname
和两者都有。
前:
案例1:当我尝试更新D001
时,我不应该将DeptID
像D002,D003或D004一样,因为它们已经存在。
案例2:当我尝试编辑DeptName
时,它不应接受任何现有的DeptNames
答案 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)
检查是否存在deptid
或deptname
,然后将值插入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)