sql-server - 在触发器中检查现有行时 SQL if 语句不起作用
问题描述
我正在创建一个触发器来检查另一列是否已经具有相同的值。但是,即使没有其他行具有相同的值,这也会返回打印。我相信错误出在 IF 子句中,但我无法弄清楚。对于数据库,使用以下 SQL。
CREATE TABLE Gebruiker
(
gebruikersnaam VARCHAR(25) NOT NULL,
voornaam VARCHAR(25) NOT NULL,
achternaam VARCHAR(25) NOT NULL,
adresregel_1 VARCHAR(255) NULL,
adresregel_2 VARCHAR(255) NULL,
postcode CHAR(7) NULL,
plaatsnaam VARCHAR(255) NULL,
land VARCHAR(255) NULL,
geboortedag CHAR(10) NOT NULL,
mailbox VARCHAR(255) NOT NULL,
wachtwoord VARCHAR(255) NOT NULL,
verkoper BIT NOT NULL,
CONSTRAINT pk_gebruiker
PRIMARY KEY (gebruikersnaam),
)
CREATE TABLE Verkoper
(
gebruikersnaam VARCHAR(25) NOT NULL,
banknaam VARCHAR(255) NULL,
rekeningnummer VARCHAR(32) NULL,
controleoptienaam CHAR(10) NOT NULL,
creditcardnummer INTEGER NULL,
CONSTRAINT pk_Verkoper
PRIMARY KEY (gebruikersnaam),
CONSTRAINT fk_Verkoper_Gebruikersnaam
FOREIGN KEY (gebruikersnaam) REFERENCES Gebruiker(gebruikersnaam),
CONSTRAINT ck_rekening
CHECK (rekeningnummer is NOT NULL OR creditcardnummer is NOT NULL),
CONSTRAINT ck_controleoptie
CHECK (controleoptienaam IN('Post', 'Creditcard'))
)
CREATE TABLE Voorwerp
(
voorwerpnummer NUMERIC(10) NOT NULL,
titel VARCHAR(255) NOT NULL,
beschrijving VARCHAR(255) NOT NULL,
startprijs NUMERIC(5,2) NOT NULL,
betalingswijze VARCHAR(255) NOT NULL,
betalingsinstructie VARCHAR(255) NOT NULL,
plaatsnaam VARCHAR(255) NOT NULL,
land VARCHAR(255) NOT NULL,
looptijd INTEGER NOT NULL,
looptijdbegindag CHAR(10) NOT NULL,
looptijdbegintijdstip CHAR(8) NOT NULL,
verzendkosten NUMERIC(5,2),
verzendinstructie VARCHAR(255) NOT NULL,
verkoper VARCHAR(25) NOT NULL,
koper VARCHAR(25) NULL,
looptijdeindedag CHAR(10) NOT NULL,
looptijdeindetijdstip CHAR(8) NOT NULL,
veilingGesloten BIT NOT NULL,
verkoopprijs NUMERIC(5,2) NOT NULL,
CONSTRAINT pk_voorwerp
PRIMARY KEY (voorwerpnummer),
CONSTRAINT fk_voorwerp_verkoper
FOREIGN KEY (verkoper) REFERENCES verkoper(gebruikersnaam),
CONSTRAINT fk_voorwerp_gebruiker
FOREIGN KEY (koper) REFERENCES gebruiker(gebruikersnaam)
)
CREATE TABLE Bod
(
voorwerpnummer NUMERIC(10) NOT NULL,
euro NUMERIC(5,2) NOT NULL,
gebruikersnaam CHAR(10) NOT NULL,
datum CHAR(10) NOT NULL,
tijdaanduiding CHAR(8) NOT NULL,
CONSTRAINT pk_Bod
PRIMARY KEY (voorwerpnummer, euro),
CONSTRAINT ak_Bod_Gebruiker_BodDag_Tijdstip
UNIQUE (gebruikersnaam, datum, tijdaanduiding),
CONSTRAINT ak_Bod_Voorwerp_BodDag_Tijdstip
UNIQUE (voorwerpnummer, datum, tijdaanduiding),
CONSTRAINT fk_Bod_Voorwerp
FOREIGN KEY (voorwerpnummer) REFERENCES Voorwerp(voorwerpnummer)
)
INSERT INTO Gebruiker
VALUES ('Lars', 'Lars', 'Last_name', NULL, NULL, NULL, NULL, NULL, '04/04/2019', 'lars@mymailbox.cloud', 'MyPassword', 1)
INSERT INTO Verkoper
VALUES ('Lars', 'ING', 'NL42INGB0685', 'Creditcard', 654654665);
INSERT INTO Voorwerp (voorwerpnummer, titel, beschrijving, startprijs, betalingswijze, betalingsinstructie, plaatsnaam, land, looptijd, looptijdbegindag, looptijdbegintijdstip, verzendkosten, verzendinstructie, verkoper, looptijdeindedag, looptijdeindetijdstip, veilinggesloten)
VALUES (3434343434, 'test', 'test', 10.00, 'bank/giro', 'betaald voor levering', 'Arnhem', 'Nederland', 7, '20/04/2019', '13:30:15', 5.00, 'pakket post', 'Lars', '27/04/2019', '12:30:15', 0);
有问题的触发器:
CREATE TRIGGER hoger_bod
ON Bod
FOR INSERT, UPDATE
AS
BEGIN
IF EXISTS (SELECT 1
FROM inserted AS i
WHERE i.voorwerpnummer IN (SELECT voorwerpnummer FROM Bod))
BEGIN
PRINT 'This voorwerpnummer already has a row.';
END;
END;
此触发器应返回“此 voorwerpnummer 已经有一行。” 当Bod
列具有相同voorwerpnummer
值的行时。
为了测试这一点,我使用了以下 INSERT 语句:
INSERT INTO Bod VALUES (3434343434, 5.01, 'Lars', '12/12/2011', '11:11:16')
这将返回“此 voorwerpnummer 已经有一行。”,即使没有行。
对于第二个插入:
INSERT INTO Bod VALUES (3434343434, 10.00, 'Lars', '12/12/2011', '11:16:16')
如果您想对此进行测试;这是一个 dbfiddle:https ://dbfiddle.uk/?fiddle=1777fa6548beef3ac5e701b7bc2c489c
解决方案
根据@GuidoG,尝试:
CREATE TRIGGER hoger_bod ON Bod
FOR INSERT,UPDATE
AS
BEGIN
IF (SELECT COUNT(*)
FROM inserted AS i
WHERE i.voorwerpnummer IN (SELECT voorwerpnummer FROM Bod)) >1
BEGIN
PRINT 'This voorwerpnummer already has a row.';
END;
END;
推荐阅读
- python - 如何在类方法中就地更改列表元素
- yii2 - 如何在 yii2 gii 生成的 crud 中添加自定义新字段
- python - 具有柱式变压器和管道的 ML 模型的参数调整
- html - 制作按钮使用动画来取消悬停鼠标
- php - PHP session_start() 和 session_abort() 的行为看起来有些出乎意料
- html - 为什么包裹在锚标签中时图像尺寸会缩小?
- javascript - 从 javascript 录制和上传音频
- flutter - 如何在颤动中用平移、倾斜和缩放值填充 Matrix4?
- javascript - 搜索嵌套的对象数组并返回所有匹配项的完整路径
- xcode - 项目构建成功但预览时出现很多错误