Bekerja dengan data di Azure Data Studio
Sekarang setelah model data Anda selesai, saatnya untuk menyisipkan beberapa data dan melihat cara kerja semua elemen yang dibuat dengan tabel.
Dalam latihan ini, Anda akan menjalankan perintah sql untuk melihat bagaimana tabel terkait dalam model data dan bagaimana aturan yang Anda buat diberlakukan.
Membuka lembar kueri baru
Untuk mulai bekerja dengan SQL di Azure SQL Database, Anda perlu membuka lembar kueri baru. Di Azure Data Studio, klik kanan server database kartu di panel kiri dan pilih Kueri Baru.
Setelah lembar kueri baru terbuka, pastikan Anda tersambung ke carddatabase Azure SQL Database menggunakan menu dropdown Database.
Bekerja dengan data
Bagian berikut akan menggunakan lembar kueri di Azure Data Studio. Setelah menyalin dan menempelkan perintah ke lembar, Anda dapat menyoroti kode SQL. Setelah disorot, tekan F5 atau pilih tombol Jalankan hijau untuk menjalankan kode SQL di Azure SQL Database Anda.
Untuk memulai, sisipkan baris ke dalam tabel kartu dengan SQL berikut.
Catatan
Untuk membuat penyisipan gambar menjadi sederhana, Anda akan mengonversi beberapa teks menjadi varbinary dengan
convert
perintah SQL.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));
Selanjutnya, tambahkan kode berikut untuk melihat baris baru dalam database dengan
select
perintah pada tabel kartu.select * from dbo.cards;
Dalam latihan sebelumnya, Anda mengatur semua kolom untuk tidak menerima nilai NULL kecuali untuk kolom card_text . Uji aturan di sini dengan meninggalkan kolom card_art. Jalankan pernyataan berikut di lembar kueri:
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);
Database tidak akan mengizinkan sisipan dan mengingatkan kita tentang aturan apa yang sedang dilanggar (yang merupakan nilai NULL di kolom card_art).
Penyisipan SQL berikut ini memutus aturan lain yang Anda tetapkan untuk tabel. Di sini, berikan warna "coklat" yang Anda tahu bahwa itu bukan nilai yang diterima. Anda membuat aturan bahwa hanya warna oranye, hitam, hijau, biru, putih, dan merah yang akan diterima di kolom.
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));
Dan seperti yang Anda lihat, sisipan ini tidak akan diterapkan ke database karena melanggar aturan untuk card_color.
Beralih ke tabel card_translations , Anda dapat melihat bagaimana kunci asing mencegah penyisipan yang tidak memiliki baris yang sesuai dalam tabel induk. Pernyataan SQL berikut akan mencoba menyisipkan baris ke dalam tabel card_translations tetapi dengan card_id2. Hanya ada satu baris dalam tabel kartu, dan yang memiliki card_id1. Salin dan tempel pernyataan SQL berikut dan jalankan di lembar kueri:
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')
Kunci asing mencegah penyisipan, seperti yang diharapkan:
Dengan menggunakan card_id yang benar, Anda bisa membuat baris dalam tabel terjemahan dengan menjalankan SQL berikut ini di lembar kueri:
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')
Dengan baris dalam tabel kartu dan tabel card_translations, gabungkan dua tabel dalam kueri dan dapatkan semua baris yang berbagi card_id umum:
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;
Pernyataan SQL berikut akan menyisipkan baris ke dalam tabel set. Anda akan menggunakan fungsi
GETDATE()
bawaan untuk menyisipkan data hari ini dalam format YYYY-MM-DD.GETDATE
Meskipun fungsi juga mengembalikan jam, menit, dan detik, jenis datanya adalahdate
, sehingga akan memotong data waktu tambahan tersebut.insert into dbo.sets (set_name, set_date) values(N'First Set', GETDATE());
Sekarang, jalankan SQL berikut untuk melihat baris dalam tabel set:
select * from dbo.sets;
Kartu berada di tabel kartu dan satu set berada dalam tabel set. Dengan dua baris ini, Anda dapat memasukkan kartu dan set ke dalam tabel set_lists dengan card_id dan set_id. Ada dua kunci asing pada tabel ini, jadi apakah SQL berikut akan berfungsi jika Anda mencoba menyisipkan card_id yang benar tetapi set_id yang salah ke dalam tabel set_lists? Jalankan SQL berikut ini di lembar kueri:
insert into dbo.set_lists (card_id, set_id) values(1,23);
Seperti yang diharapkan, sisipan diblokir oleh pelanggaran kunci asing:
Menjalankan kueri dengan ID yang benar akan menghasilkan penyisipan yang berhasil ke dalam tabel set_lists. Jalankan SQL berikut ini di lembar kueri:
insert into dbo.set_lists (card_id, set_id) values(1,1);
Dengan data di keempat tabel, gunakan kueri SQL berikut untuk mendapatkan tampilan kartu yang dimasukkan ke dalam database, terjemahannya, dan set tempat mereka berada. Jalankan SQL berikut ini di lembar kueri:
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;
Jika Anda ingat lagi kembali ke bab tentang batasan tabel, ada bagian yang berbicara tentang batasan unik. Batasan ini memungkinkan Anda menerapkan aturan di satu atau beberapa kolom untuk memastikan bahwa tabel tidak memiliki nilai duplikat, mirip dengan kolom Kunci Primer. Melihat tabel set_lists , Anda mungkin memperhatikan bahwa Anda dapat menyisipkan card_id dan set_id ke dalam tabel ini beberapa kali membuat data duplikat. Jika Menerapkan batasan unik, Anda dapat mencegah perilaku ini.
Anda dapat membuat batasan unik pada kolom card_id dan set_id . Batasan unik ini akan memberi tahu database "jangan biarkan siapa pun menyisipkan baris dengan kombinasi card_id dan set_id yang sudah ada dalam tabel." Jalankan SQL berikut ini di lembar kueri untuk membuat batasan unik ini:
ALTER TABLE dbo.set_lists ADD CONSTRAINT one_card_in_set UNIQUE (card_id, set_id); GO
Dan sekarang, coba SQL berikut ini lagi:
insert into dbo.set_lists (card_id, set_id) values(1,1);
Anda akan melihat kesalahan saat menghentikan penyisipan ini dan mencegah data duplikat dalam tabel:
Dapatkah Anda memikirkan situasi lain di mana batasan unik dapat berguna dalam mencegah data duplikat dalam aplikasi referensi kartu?
Untuk mendapatkan gambaran yang lebih baik tentang bagaimana model data berkumpul untuk aplikasi referensi kartu, Anda dapat menambahkan lebih banyak data ke tabel. Jalankan pernyataan SQL berikut ini di lembar kueri:
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);
Jika Anda menjalankan kueri SQL gabungan empat tabel ini lagi, Anda dapat melihat semua kartu, terjemahannya, dan set tempatnya berada. Jalankan pernyataan SQL berikut ini di lembar kueri:
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;