Arbeiten mit Daten in Azure Data Studio
Nachdem Ihr Datenmodell nun fertig ist, ist es an der Zeit, einige Daten einzufügen und zu ermitteln, wie alle mit den Tabellen erstellten Elemente funktionieren.
In dieser Übung führen Sie SQL-Befehle aus, um zu ermitteln, wie die Tabellen im Datenmodell zusammenhängen und wie die von Ihnen erstellten Regeln erzwungen werden.
Neue Abfragetabelle öffnen
Damit Sie anfangen können, in der Azure SQL-Datenbank mit SQL zu arbeiten, müssen Sie eine neue Abfragetabelle öffnen. Klicken Sie in Azure Data Studio im linken Bereich mit der rechten Maustaste auf den Kartendatenbankserver, und wählen Sie neue Abfrage aus.
Sobald die neue Abfragetabelle geöffnet ist, stellen Sie über die Dropdownliste Datenbank sicher, dass Sie mit der Azure SQL-Datenbank carddatabaseverbunden sind.
Arbeiten mit Daten
Im folgenden Abschnitt wird die Abfragetabelle in Azure Data Studio verwendet. Nachdem Sie einen Befehl kopiert und in die Tabelle eingefügt haben, können Sie den SQL-Code hervorheben. Drücken Sie nach dem Hervorheben entweder F5, oder klicken Sie auf die grüne Schaltfläche Ausführen, um den SQL-Code in der Azure SQL-Datenbank auszuführen.
Fügen Sie zunächst per SQL wie folgt eine Zeile in die Kartentabelle ein.
Hinweis
Konvertieren Sie zur Vereinfachung des Einfügens von Bildern einfach Text mit dem SQL-Befehl
convert
in den Datentyp Varbinary.insert into dbo.cards (card_name, card_type, card_color, card_power, card_text, card_status, card_art) values(N'Duck', N'monster',N'white',10,N'Quack Attack', 1, CONVERT(varbinary(max), 'DUCK_PICTURE_HERE', 0));
Fügen Sie als Nächstes mit dem Befehl
select
in der Kartentabelle folgenden Code zur neuen Zeile in der Datenbank hinzu.select * from dbo.cards;
In der vorherigen Übung haben Sie festgelegt, dass keine der Spalten NULL-Werte akzeptiert, mit Ausnahme der Spalte card_text. Testen Sie die Regel hier, indem Sie die Spalte card_art weglassen. Führen Sie die folgende Anweisung in der Abfragetabelle aus:
insert into dbo.cards (card_name, card_type, card_color, card_power, card_text, card_status) values(N'Sword', N'weapon',N'black',10,N'S Words', 1);
In der Datenbank wird der Einfügevorgang nicht zugelassen, und Sie werden daran erinnert, welche Regel verletzt wird (Null-Werte in der Spalte card_art).
Die folgende SQL-Einfügung verstößt gegen eine andere Regel, die Sie für die Tabelle festgelegt haben. Übergeben Sie hier die Farbe „Braun“, von der Sie wissen, dass es sich um einen nicht akzeptierten Wert handelt. Sie haben die Regel erstellt, dass nur die Farben Orange, Schwarz, Grün, Blau, Weiß und Rot in der Spalte akzeptiert werden.
insert into dbo.cards (card_name, card_type, card_color, card_power, card_text, card_status, card_art) values(N'Sword', N'weapon',N'brown',10,N'S Words', 1, CONVERT(varbinary(max), 'SWORD_PICTURE_HERE', 0));
Wie Sie sehen können, wird diese Einfügung nicht in die Datenbank committet, da sie gegen die Regel für card_color verstoßen hat.
Wenn Sie zur Tabelle card_translations wechseln, können Sie sehen, wie ein Fremdschlüssel Einfügungen verhindert, die keine entsprechenden Zeilen in der übergeordneten Tabelle enthalten. Mit der folgenden SQL-Anweisung wird versucht, eine Zeile in die Tabelle card_translations einzufügen, jedoch mit einer card_id von 2. Es gibt nur eine Zeile in der Kartentabelle, und die weist die card_id 1 auf. Kopieren Sie die folgende SQL-Anweisung, fügen Sie sie ein, und führen Sie sie in der Abfragetabelle aus:
Insert into dbo.card_translations(card_id, translation_card_language, translation_card_name, translation_card_text) values(2,N'Spanish',N'Pato',N'Ataque de graznar')
Der Fremdschlüssel verhindert das Einfügen wie erwartet:
Mit einer korrekten card_id können Sie eine Zeile in der Übersetzungstabelle erstellen, indem Sie den folgenden SQL-Code in der Abfragetabelle ausführen:
insert into dbo.card_translations(card_id, translation_card_language, translation_card_name, translation_card_text) values(1,N'Spanish',N'Pato',N'Ataque de graznar')
Verknüpfen Sie mit einer Zeile in der Kartentabelle und der Tabelle card_translations die beiden Tabellen in einer Abfrage, und rufen Sie alle Zeilen ab, die eine gemeinsame card_id aufweisen:
select c.card_id 'card_id from cards table', t.card_id 'card_id from card_translation table', c.card_name, t.translation_card_name from dbo.cards c, dbo.card_translations t where c.card_id = t.card_id;
Mit der folgenden SQL-Anweisung wird eine Zeile in die Tabelle sets eingefügt. Sie verwenden die integrierte Funktion
GETDATE()
, um die Daten des heutigen Tages im Format JJJJ-MM-TT einzufügen. Während dieGETDATE
-Funktion auch Stunden, Minuten und Sekunden zurückgibt, ist der Datentypdate
, sodass diese zusätzlichen Zeitdaten abgeschnitten werden.insert into dbo.sets (set_name, set_date) values(N'First Set', GETDATE());
Führen Sie nun den folgenden SQL-Code aus, um die Zeile in der Tabelle „sets“ anzuzeigen:
select * from dbo.sets;
Eine Karte befindet sich in der Tabelle cards, und ein Satz befindet sich in der Tabelle sets. Mit diesen beiden Zeilen können Sie eine Karte und einen Satz sowohl mit card_id als auch mit set_id in die Tabelle set_lists eingeben. Es gibt zwei Fremdschlüssel in dieser Tabelle. Funktioniert der folgende SQL-Code, wenn Sie versuchen, eine richtige card_id, aber eine falsche set_id in die Tabelle set_lists einzufügen? Führen Sie den folgenden SQL-Code in der Abfragetabelle aus:
insert into dbo.set_lists (card_id, set_id) values(1,23);
Wie erwartet wurde die Einfügung durch einen Fremdschlüsselverstoß blockiert.
Das Ausführen der Abfrage mit den richtigen IDs führt zu einer erfolgreichen Einfügung in die Tabelle set_lists. Führen Sie den folgenden SQL-Code in der Abfragetabelle aus:
insert into dbo.set_lists (card_id, set_id) values(1,1);
Verwenden Sie mit den Daten in allen vier Tabellen die folgende SQL-Abfrage, um eine Ansicht der in die Datenbank eingegebenen Karten, ihrer Übersetzungen und der Sätze anzuzeigen, zu denen sie gehören. Führen Sie den folgenden SQL-Code in der Abfragetabelle aus:
select c.card_id, c.card_name, t.translation_card_name, s.set_name, s.set_date from dbo.cards c, dbo.card_translations t, dbo.sets s, dbo.set_lists l where c.card_id = t.card_id and c.card_id = l.card_id and s.set_id = l.set_id;
Wenn Sie sich noch einmal an das Kapitel über Tabelleneinschränkungen erinnern, gab es dort einen Abschnitt zum Thema Unique-Einschränkungen. Mit diesen Einschränkungen können Sie eine Regel auf mindestens eine Spalte anwenden, um sicherzustellen, dass die Tabelle keine doppelten Werte aufweist. Dies ähnelt der Primärschlüsselspalte. Wenn Sie sich die Tabelle set_lists ansehen, haben Sie möglicherweise festgestellt, dass Sie eine card_id und eine set_id mehrmals in diese Tabelle einfügen könnten, um doppelte Daten zu erstellen. Wenn Sie eine Unique-Einschränkung anwenden, können Sie dieses Verhalten verhindern.
Sie können eine Unique-Einschränkung für die Spalten card_id und set_id erstellen. Diese Unique-Einschränkung legt für die Datenbank Folgendes fest: „Niemand darf eine Zeile mit einer Kombination von card_id und set_id einfügen, die bereits in der Tabelle vorhanden ist.“ Führen Sie den folgenden SQL-Code in der Abfragetabelle aus, um diese Unique-Einschränkung zu erstellen:
ALTER TABLE dbo.set_lists ADD CONSTRAINT one_card_in_set UNIQUE (card_id, set_id); GO
Versuchen Sie es nun erneut mit dem folgenden SQL-Code:
insert into dbo.set_lists (card_id, set_id) values(1,1);
Es wird ein Fehler angezeigt, der diese Einfügung beendet und doppelte Daten in der Tabelle verhindert.
Können Sie sich andere Situationen vorstellen, in denen eine Unique-Einschränkung nützlich sein könnte, um doppelte Daten in der Kartenverweisanwendung zu verhindern?
Damit Sie ein besseres Bild davon erhalten, wie das Datenmodell für die Kartenverweisanwendung aufgebaut ist, können Sie den Tabellen weitere Daten hinzufügen. Führen Sie die folgende SQL-Anweisung in der Abfragetabelle aus:
declare @cardTable2 table (card_id int); declare @cardTable3 table (card_id int); declare @cardTable4 table (card_id int); declare @cardTable5 table (card_id int); insert into dbo.cards (card_name, card_type, card_color, card_power, card_text, card_status, card_art) OUTPUT Inserted.[card_id] into @cardTable2 values(N'Sword', N'weapon',N'white',10,N'+2 Power', 1, CONVERT(varbinary(max), 'SWORD_PICTURE_HERE', 0)); insert into dbo.cards (card_name, card_type, card_color, card_power, card_text, card_status, card_art) OUTPUT Inserted.[card_id] into @cardTable3 values(N'Caterpillar', N'monster',N'green',10,NULL, 1, CONVERT(varbinary(max), 'CRAWLY_PICTURE_HERE', 0)); insert into dbo.cards (card_name, card_type, card_color, card_power, card_text, card_status, card_art) OUTPUT Inserted.[card_id] into @cardTable4 values(N'Goblin', N'monster',N'red',10,N'Can set fires', 1, CONVERT(varbinary(max), 'GOBLIN_PICTURE_HERE', 0)); insert into dbo.cards (card_name, card_type, card_color, card_power, card_text, card_status, card_art) OUTPUT Inserted.[card_id] into @cardTable5 values(N'Full Plate Armor', N'armor',N'black',10,N'+4 Protection', 1, CONVERT(varbinary(max), 'PLATE_ARMOR_PICTURE_HERE', 0)); declare @card2i int = (select card_id from @cardTable2); declare @card3i int = (select card_id from @cardTable3); declare @card4i int = (select card_id from @cardTable4); declare @card5i int = (select card_id from @cardTable5); insert into dbo.card_translations(card_id, translation_card_language, translation_card_name, translation_card_text) values(@card2i,N'Spanish',N'Espada',N'+2 Poder') insert into dbo.card_translations(card_id, translation_card_language, translation_card_name, translation_card_text) values(@card3i,N'Japanese',N'毛虫',NULL) insert into dbo.card_translations(card_id, translation_card_language, translation_card_name, translation_card_text) values(@card4i,N'French',N'Lutin',N'Puede provocar incendios') insert into dbo.card_translations(card_id, translation_card_language, translation_card_name, translation_card_text) values(@card5i,N'German',N'Vollständige Plattenpanzerung',N'+4 Schutz') insert into dbo.sets (set_name, set_date) values(N'Second Set', GETDATE()); insert into dbo.set_lists (card_id, set_id) values(@card2i,1); insert into dbo.set_lists (card_id, set_id) values(@card3i,1); insert into dbo.set_lists (card_id, set_id) values(@card4i,1); insert into dbo.set_lists (card_id, set_id) values(@card3i,2); insert into dbo.set_lists (card_id, set_id) values(@card4i,2); insert into dbo.set_lists (card_id, set_id) values(@card5i,2);
Wenn Sie diese SQL-Abfrage für den Join mit vier Tabellen erneut ausführen, werden alle Karten, ihre Übersetzungen und die Sätze angezeigt, zu denen sie gehören. Führen Sie die folgende SQL-Anweisung in der Abfragetabelle aus:
select c.card_id, c.card_name, t.translation_card_language, t.translation_card_name, s.set_name, s.set_date from dbo.cards c, dbo.card_translations t, dbo.sets s, dbo.set_lists l where c.card_id = t.card_id and c.card_id = l.card_id and s.set_id = l.set_id order by s.set_id, c.card_id;