SQL Server procedura generująca

0

Witam serdecznie forumowiczów.
Po raz kolejny zgłaszam się do was z problemem dotyczącym generatora danych w języku sql dla środowiska Microsoft SQL Server Management Studio.
Utworzyłem procedurę której zadaniem jest dodanie 1000 rekordów do określonej tabeli:
Tabela equipment:
id_equipment int (identity, klucz główny), quantity bigint, symbol varchar(15), name varchar (32), description varchar (512), id_room int
tabela jest połączona z dwoma innymi tabelami.
e8347e151b.png

Problemem jest to, że ostatnie pole tej tabeli : id_room jest wykożystywane jako klucz obcy do tabeli room i podczas dodawania rekordów do tabeli equipment wyrzuca mi błąd dotyczący:
Cannot insert the value NULL into column 'id_room', table 'nowa.dbo.equipment'; column does not allow nulls. INSERT fails.
The statement has been terminated.

Generator wygląda następująco:

PROCEDURE [dbo].[dodaj_do_tabeli_equipment]
AS
DECLARE @licznik VARCHAR (3); 
SET @licznik=1;
WHILE @licznik <= 1000
BEGIN 
   INSERT INTO equipment (quantity, symbol, name, description) 
    SELECT 'quantity' = @licznik, 'symbol' + CAST(ISNULL(MAX (id_equipment),0) + 1 AS VARCHAR), 'name' + CAST(ISNULL(MAX 

(id_equipment),0) + 1 AS VARCHAR), 'description' + CAST(ISNULL(MAX (id_equipment),0) + 1 AS VARCHAR) FROM equipment
    SET @licznik = @licznik + 1;
END

Co mogę w tej sprawie zrobić? Czy muszę usunąć tabele equipment oraz parę innych z nią powiązanych i stworzyć je na nowo z, np. ww. problematycznym polem id_room dodając mu identity? Czy mogę to jakoś ominąć?
Proszę o pomoc, nie potrafię sobie z tym poradzić.

1

Można wyłączyć sprawdzanie klucza obcego.

https://msdn.microsoft.com/pl-pl/library/ms175041(v=sql.110).aspx

0

Ale czy zostawienie tego pola pustego nie będzie również problemem? Później na tych właśnie id-kach buduję zapytania do tej bazy.
Lepiej faktycznie wyłączyć sprawdzanie tego klucza obcego czy w jakiś sposób da się (i powinno się) zmodyfikować to polę (id_room w tabeli equipment) i dać mu identity co przeloży się na to, że będzie dostawało tak jakby numer porządkowy (albo raczej numer id zgodny z id-kiem od tabeli equipment)?

2

A nie możesz po prostu najpierw wstawić danych do room, a potem do equipment?

0

Próbowałem ale nie przeszło. Co się okazuje nie mogę mieć identity na dwóch atrybutach. W końcu byłem zmuszony zniszczyć tą tabelę, razem z relacjami. Odtworzyć ją na nowo oraz pozwlić by w polu id_room w tabeli equipment pojawiały się nulle. Nie wiem czy tak ma być ale szczerze mówiąc nie cieszę się, że nie udało mi się tego rozwiązać zwykłą metodą tylko po informatycznemu (czyli jak nie działa to reset).

1

Wydaje mi się, że nie do końca wiesz co robisz.

Tak jak mówił @somekind wstawienie danych do room jest najprostszym i najszybszym sposobem. Moim zdaniem też najlepszym bo po to został tam stworzony klucz obcy.

0

Wydaje mi się też, że nie do końca zostałem zrozumiany. Mimo dodania wcześniej danych do tabeli room nie mogłem wypełnić pól w tabeli equipment (w moim generatorze nie był uwzględniony id_room, ale to widzicie). Wiem, że pola id_room ani w jednej tabeli ani w drugiej nie mogę modyfikować (albo raczej nie powinienem, chyba nie ma znaczenia jak to ujmę). Początkowy zamysł faktycznie był błędny. Natomiast wydaje mi się że komentarz @somekind był nie na miejscu, nie wszyscy pracują z tą technologią na porządku dziennym i może komuś coś umknąć.

0

To uwzględnij to id_room w swoim generatorze zamiast szukać rozwiązań naokoło, nazywając je jednocześnie "po informatycznemu" (to przez to mi ręce opadły).
Nie jest to trudne, wystarczy je odczytać, a później losowo albo nawet sekwencyjnie przydzielać do rekordów equipment.

0

Bardzo dojrzałe podejście, zwłaszcza "nie jest to trudne". Chyba moja wypowiedź wyżej nie była przeczytana do końca? Tak czy inaczej zamiast podpowiedzieć komuś uważasz, że lepiej się z niego ponabijać. A co do mojego "podejście po informatycznemu" nie jest to mój wymysł ani moje naskakiwanie na informatyków (jakby nie patrzeć sam staram się jednym zostać). Sam na uczelni nie raz widziałem doktora, inżyniera czy nawet profesora który nawiązywał do tego lub sam to robił. Moje niezadowolenie wynikało z tego TU PODKREŚLAM : NIE UDAŁO MI SIĘ DOJŚĆ DO ROZWIĄZANIA MOJEGO PROBLEMU NIEINWAZYJNĄ METODĄ (bez usunięcia tabeli equipment nie mogłem jej edytować, co mimo wszystko nie było wymagane).

0
M3How napisał(a):

Bardzo dojrzałe podejście, zwłaszcza "nie jest to trudne". Chyba moja wypowiedź wyżej nie była przeczytana do końca? Tak czy inaczej zamiast podpowiedzieć komuś uważasz, że lepiej się z niego ponabijać.

Nie bardzo rozumiem jak inaczej miałbym Ci pomóc niż podając pomysł na prawidłowe rozwiązanie?
Masz klucz obcy z tabeli A w tabeli B, więc w tę kolumnę tabeli B musisz wstawić wartości istniejące w kolumnie źródłowej tabeli A. Żadnej innej filozofii tu nie trzeba.

Moje niezadowolenie wynikało z tego TU PODKREŚLAM : NIE UDAŁO MI SIĘ DOJŚĆ DO ROZWIĄZANIA MOJEGO PROBLEMU NIEINWAZYJNĄ METODĄ (bez usunięcia tabeli equipment nie mogłem jej edytować, co mimo wszystko nie było wymagane).

Dobrze, że nie jesteś lekarzem, bo mógłbyś wpaść na pomysł, że włożenie chorego na grypę do pieca kremacyjnego jest dobrym sposobem pozbycia się zarazków, gdy zawiodą "nieinwazyjne metody". :)

A skoro już o dojrzałości mowa - nie ma nic bardziej niedojrzałego niż podejście "nie rozumiem, więc zrobię od nowa".

0

Odnośnie ostatniego akapitu jakbyś nie zauważył, jakiekolwiek modyfikacje na utworzonej i zapisanej tabeli (gdzie nie znało się opcji która nie zapisuje tabeli gdy oznacza to że dalsze wprowadzanie zmian byłoby niemożliwe) wymaga właśnie : nie rozumiem, więc zrobię od nowa. Pomocny panie moderatorze, jak to mówią thanks for nothing. Im off.

1

W tym rzecz, że nie musisz modyfikować utworzonej tabeli, wystarczy wstawić dane zgodne z narzuconymi ograniczeniami. Uczynienie nullowalną kolumny, która nie powinna taka być, nie jest żadnym rozwiązaniem problemu.

A co do modyfikacji tabel w graficznym designerze - to wystarczyło przeczytać ze zrozumieniem prosty komunikat. Albo po prostu spytać.

Niestety, ale programowanie wymaga myślenia, a nie naparzania w losowe przyciski licząc, że coś się uda.

0

Oczywiście masz racje, ale jak masz nóż na gardle i mało czasu to będziesz eksperymentował czyż nie? Nie mając dowodów na to, że ktokolwiek Ci pomoże będziesz starał się zrobić coś żeby swój problem rozwiązać. Chyba, że samo moje założenie jest błędne i tylko ja się mylę i eksperymentuję jak czegoś nie wiem i nie mam gwarancji na to że ktoś mi podpowie. A co do komunikatu. Po wklepaniu danych do tabeli room dalej nie mogłem wprowadzić danych do tabeli equipment, natomiast komunikat który otrzymywałem w kreatorze graficznym właśnie mówił mi, że musze "zdropować tabelę equipment i stworzyć ją na nowo jeśli chcę ją edytować".

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.