Melihat melalui database, saya menemukan sebuah tabel yang menggunakan kunci utamanya sebagai kunci asing untuk dirinya sendiri.
Saya telah melihat bahwa sebuah tabel dapat memiliki kunci asing untuk dirinya sendiri untuk membangun struktur hierarki, tetapi akan menggunakan kolom lain untuk referensi kunci utama.
Karena kunci utama itu unik, dalam situasi ini bukankah baris hanya dapat menunjuk kembali ke dirinya sendiri? Itu tampaknya merupakan tautan tautologis, karena jika saya sudah memiliki baris, maka saya sudah memiliki baris.
Apakah ada alasan mengapa hal ini dilakukan?
Saya yakin batasannya ditulis seperti itu (tidak hanya melihat diagram) karena tabel dan kolom yang sama digunakan untuk kedua bagian definisi.
sql-server
foreign-key
primary-key
Aaroninus
sumber
sumber
Jawaban:
Seperti yang kamu katakan. Sebuah
FOREIGN KEY
kendala referensi meja yang sama biasanya untuk struktur hirarki dan itu akan menggunakan kolom lain untuk referensi kunci utama. Contoh yang baik adalah tabel karyawan:Jadi dalam hal ini ada kunci asing dari tabel kembali ke dirinya sendiri. Semua manajer adalah juga karyawan sehingga
ManagerId
sebenarnya adalahEmployeeId
milik manajer.Sekarang di sisi lain jika Anda bermaksud seseorang menggunakan
EmployeeId
kunci asing kembali ke tabel Karyawan maka itu mungkin kesalahan . Saya memang menjalankan tes dan itu mungkin tetapi tidak akan ada gunanya nyata.sumber
Saya baru saja menemukan kunci asing di db saya sendiri dan pasti saya sendiri yang membuatnya. Saya pikir ini baru saja terjadi secara kebetulan. Jika saya mengklik "Kunci Asing Baru" di menu konteks tabel dengan kunci utama (dalam Management Studio, SQL 2014 Express) ini sudah secara otomatis membuat kunci asing seperti itu merujuk pada dirinya sendiri. Lihat di bawah:
Jika saya kemudian tidak menyadari bahwa saya harus mengubah yang itu alih-alih menambahkan yang baru, itu akan tetap ada. Atau, jika saya cukup klik pada tombol [Tutup] yang berarti ini akan seperti [Batal], kunci asing masih akan dibuat setelah menyimpan definisi tabel.
Jadi, bagi saya Kunci Asing seperti itu tidak masuk akal dan dapat dihapus.
sumber
Mungkin desainer ingin menonaktifkan penggunaan
TRUNCATE TABLE
?TRUNCATE TABLE
tidak dapat digunakan pada tabel dengan batasan kunci asing ke tabel lain meskipun itu dapat digunakan jika ada kunci asing referensial sendiri . Dari dokumentasi untuk TRUNCATE TABLE (Transact-SQL) :Sebuah
DELETE
pernyataan tanpaWHERE
klausa memiliki efek mirip denganTRUNCATE TABLE
(menghapus semua baris dalam tabel) tetapiDELETE
pernyataan kebakaran pemicu menghapus, yang mungkin menjadi alasan untuk memungkinkanDELETE
tapi tidakTRUNCATE TABLE
.Saya akan melakukan ini dengan menggunakan izin (
DELETE
memerlukan izin hapus,TRUNCATE TABLE
memerlukan izin mengubah tabel), tetapi mungkin ada beberapa alasan perancang tidak dapat melakukan ini?Catatan: Meskipun apa yang telah dilakukan perancang sebenarnya tidak menonaktifkan penggunaan
TRUNCATE TABLE
, saya masih berspekulasi bahwa ini adalah maksud mereka.sumber