Reputation: 33
I am creating a trigger that checks if another column already has the same value. This however returns a print even if there is no other row with the same value. I believe the mistake is in the IF clause, but I can't figure it out. For the database the following SQL is used.
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', '[email protected]', '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);
The trigger in question:
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;
This trigger should return 'This voorwerpnummer already has a row.' when the Bod
column has a row with the same voorwerpnummer
value.
To test this I've used the following INSERT statement:
INSERT INTO Bod VALUES (3434343434, 5.01, 'Lars', '12/12/2011', '11:11:16')
This returns 'This voorwerpnummer already has a row.', even though there are no rows.
For a second insert:
INSERT INTO Bod VALUES (3434343434, 10.00, 'Lars', '12/12/2011', '11:16:16')
If you'd like to test this; here is a dbfiddle: https://dbfiddle.uk/?fiddle=1777fa6548beef3ac5e701b7bc2c489c
Upvotes: 1
Views: 67
Reputation: 7753
As per @GuidoG, try:
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;
Upvotes: 1