Violation of PRIMARY KEY constraint - błąd

0

Witam.
Mam takie zadanie(chodzi o Zad.2):
Zad.1

Napisz procedurę dopisującą nowego gościa. Jeśli gość o takim imieniu oraz nazwisku już istnieje, nie wprowadzaj danych.

Zad.2

Zmodyfikuj procedurę z zadania 1 tak, aby wprowadzała od razu rezerwację. Parametrami procedury będą: imię, nazwisko, nr_pokoju, data_od, data_do.

Kod:

ALTER PROCEDURE dodaj_goscia2 (@Imie varchar(30), @Nazwisko varchar(30), @NrPokoju int, @DataOd DateTime, @DataDo DateTime )
AS BEGIN
	 IF EXISTS(SELECT 1 FROM Gosc WHERE Imie=@Imie and Nazwisko=@Nazwisko)
		PRINT 'TAKA OSOBA JUŻ ISTNIEJE';
	ELSE
	BEGIN
		Declare @id int, @idrez int
		select @id = isnull(MAX(IdGosc), 0)+1 from Gosc
		select @idrez = isnull(MAX(IdRezerwacja), 0)+1 from Rezerwacja
		IF Exists(SELECT 1 FROM Rezerwacja WHERE NrPokoju=@NrPokoju)
		BEGIN
		INSERT INTO Gosc(IdGosc, Imie, Nazwisko)
		SELECT @id, @Imie, @Nazwisko FROM Gosc
		INSERT INTO Rezerwacja(IdRezerwacja, NrPokoju, DataOd, DataDo, IdGosc, Zaplacona)
		SELECT @idrez, @NrPokoju, @DataOd, @DataDo, @id, 1 FROM Rezerwacja
		PRINT 'Dodano osobę i rezerwacje! '+@Imie+' '+@Nazwisko	
		END
		ELSE
			print 'Nie ma takiego pokoju!'
	END
END

Wyskakują takie błędy jak na załączniku rezultat.png
W czym tkwi problem o jaką duplikację chodzi?

1
 INSERT INTO Gosc(IdGosc, Imie, Nazwisko)
        SELECT @id, @Imie, @Nazwisko FROM Gosc

powinno być VALUES (@id, @Imie, @Nazwisko)

w przeciwnym razie wstawiasz tyle rekordów ile już jest w tabeli Gosc a więc dostajesz duplikaty
poza tym co to za baza danych? Nie ma automatycznego numerowania rekordów? Identity / sekwencje? Max(Id) + 1 to kiepski pomysł

0

Jest to baza uczelniana do poćwiczenia. Nie ma w niej ustawionego identity. Możesz mi wytłumaczyć dlaczego jak używam SELECT to wstawiam tyle rekordów ile jest już w tabeli Gość, bo tego nie widzę.

1
Lukis92 napisał(a):

Możesz mi wytłumaczyć dlaczego jak używam SELECT to wstawiam tyle rekordów ile jest już w tabeli Gość, bo tego nie widzę.

odpal sobie

SELECT IdGosc, Imie, Nazwisko FROM Gosc

Potem odpal

SELECT 'a', 'b', Imie, Nazwisko FROM Gosc

A potem pomyśl co zostanie wstawione jeżeli wstawiasz (INSERT) wynik zapytania

SELECT @id, @Imie, @Nazwisko FROM Gosc

1

i nie "jak używasz SELECT" tylko jak używasz SELECT FROM tabela
Jeżeli usuniesz FROM Goscie to wszystko też będzie dobrze, ale forma z VALUES jest lepiej czytelna

0

Dobra wszystko już jasne. Dzięki Wam za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1