คำถามติดแท็ก foreign-keys

กุญแจต่างประเทศเป็นคุณสมบัติด้านความสมบูรณ์ของข้อมูลของฐานข้อมูลเชิงสัมพันธ์ (และ SQL) foreign key คือชุดของแอ็ตทริบิวต์ในตารางเชิงสัมพันธ์ที่อยู่ภายใต้ข้อ จำกัด ของ Referential integrity ข้อ จำกัด ของ Referential Integrity นั้นค่าของแอตทริบิวต์ foreign key ในตารางหนึ่งต้องตรงกับค่าที่เกี่ยวข้องในตาราง B ที่ระบุ (ซึ่งบางครั้งอาจเป็นตารางเดียวกันกับ A)

15
เมื่อใด / เพราะเหตุใดจึงใช้ Cascading ใน SQL Server
เมื่อตั้งค่าคีย์ต่างประเทศใน SQL Server ภายใต้สถานการณ์ใดที่คุณควรให้มันเป็นลบหรือปรับปรุงและเหตุผลที่อยู่เบื้องหลังมันคืออะไร? อาจใช้กับฐานข้อมูลอื่นเช่นกัน ฉันกำลังมองหาตัวอย่างที่เป็นรูปธรรมมากที่สุดของแต่ละสถานการณ์โดยเฉพาะอย่างยิ่งจากคนที่ใช้พวกเขาสำเร็จ

6
บังคับให้ mysql ลดลงโดยข้ามข้อ จำกัด ของคีย์ต่างประเทศ
ฉันพยายามลบตารางทั้งหมดออกจากฐานข้อมูลยกเว้นตารางเดียวและพบข้อผิดพลาดต่อไปนี้: ไม่สามารถลบหรืออัปเดตแถวหลัก: ข้อ จำกัด ของคีย์นอกระบบล้มเหลว แน่นอนว่าฉันสามารถลองผิดลองถูกเพื่อดูว่าข้อ จำกัด สำคัญเหล่านั้นคืออะไรและในที่สุดก็ลบตารางทั้งหมด แต่ฉันอยากรู้ว่ามีวิธีที่รวดเร็วในการบังคับให้วางตารางทั้งหมดหรือไม่ (ฉันจะสามารถแทรกใหม่ได้ ไม่ต้องการลบ) Google เล็งฉันไปที่ไซต์บางแห่งที่แนะนำวิธีการต่อไปนี้: mysql> SET foreign_key_checks = 0; mysql> drop table ... mysql> SET foreign_key_checks = 1; คำตอบสั้น ๆ คือมันไม่ได้ทำเคล็ดลับจริงๆเนื่องจากฉันได้รับข้อผิดพลาดเดียวกันในขณะที่ฉันสามารถลบตารางเพิ่มเติมได้ ฉันเคยเห็นวิธี Stack Overflow ในการรับคีย์ต่างประเทศทั้งหมดที่เชื่อมโยงกับตารางบางตาราง แต่นั่นเป็นวิธีที่ใช้เวลานานเกินไปเว้นแต่ฉันจะเขียนสคริปต์ทั้งหมด (ซึ่งทำได้ในกรณีที่ไม่มีตัวเลือกอื่น) ฐานข้อมูลคือ 4.1 ดังนั้นฉันจึงใช้ไม่ได้ DROP DATABASE ไอเดีย?

2
ทับทิมบนราง. ฉันจะใช้วิธีการสร้างเรกคอร์ด. Active ใน a: เป็นของความสัมพันธ์ได้อย่างไร
ฉันไม่พบเอกสารใด ๆ เกี่ยวกับวิธีการสร้างใน Rails (ขณะนี้ฉันใช้ 2.0.2) ดูเหมือนว่าคุณสามารถใช้วิธีการสร้างเพื่อเพิ่มระเบียนลงในhas_manyความสัมพันธ์ก่อนที่จะบันทึกระเบียนใดก็ได้ ตัวอย่างเช่น: class Dog < ActiveRecord::Base has_many :tags belongs_to :person end class Person < ActiveRecord::Base has_many :dogs end # rails c d = Dog.new d.tags.build(:number => "123456") d.save # => true สิ่งนี้จะช่วยทั้งสุนัขและแท็กด้วยปุ่มต่างประเทศอย่างเหมาะสม สิ่งนี้ดูเหมือนจะไม่ทำงานในbelongs_toความสัมพันธ์ d = Dog.new d.person.build # => nil object on nil.build ฉันได้ลองแล้ว …

8
ฉันจะเพิ่มคีย์ภายนอกลงในตาราง SQLite ที่มีอยู่ได้อย่างไร
ฉันมีตารางต่อไปนี้: CREATE TABLE child( id INTEGER PRIMARY KEY, parent_id INTEGER, description TEXT); ฉันจะเพิ่มข้อ จำกัด ของ Foreign Key ได้parent_idอย่างไร? สมมติว่ามีการเปิดใช้งานคีย์ต่างประเทศ ตัวอย่างส่วนใหญ่สมมติว่าคุณกำลังสร้างตาราง - ฉันต้องการเพิ่มข้อ จำกัด ให้กับตารางที่มีอยู่
128 sql  sqlite  foreign-keys  ddl 

1
postgresql ไวยากรณ์คีย์ต่างประเทศ
ฉันมี 2 ตารางดังที่คุณจะเห็นในรหัส posgresql ด้านล่าง นักเรียนในตารางแรกมี 2 คอลัมน์คอลัมน์หนึ่งสำหรับ student_name และ student_id อื่น ๆ ซึ่งเป็นคีย์หลัก ในตารางที่สองของฉันเรียกว่าการทดสอบมี 4 คอลัมน์คอลัมน์หนึ่งสำหรับ subject_id หนึ่งคอลัมน์สำหรับชื่อเรื่องและอีกคอลัมน์สำหรับนักเรียนที่มีคะแนนสูงสุดในวิชาที่สูงที่สุดนักเรียน_id ฉันกำลังพยายามทำให้ maximumStudent_id อ้างถึง student_id ในตารางนักเรียนของฉัน นี่คือรหัสที่ฉันมีด้านล่างฉันไม่แน่ใจว่าไวยากรณ์ถูกต้องหรือไม่: CREATE TABLE students ( student_id SERIAL PRIMARY KEY, player_name TEXT); CREATE TABLE tests ( subject_id SERIAL, subject_name, highestStudent_id SERIAL REFERENCES students); ไวยากรณ์highestStudent_id SERIAL REFERENCES studentsถูกต้องหรือไม่ …

24
คีย์ต่างประเทศจำเป็นในการออกแบบฐานข้อมูลหรือไม่?
เท่าที่ฉันทราบมีการใช้คีย์ต่างประเทศ (FK) เพื่อช่วยโปรแกรมเมอร์ในการจัดการข้อมูลด้วยวิธีที่ถูกต้อง สมมติว่าโปรแกรมเมอร์กำลังทำสิ่งนี้ในลักษณะที่ถูกต้องอยู่แล้วเราต้องการแนวคิดของคีย์ต่างประเทศหรือไม่? มีการใช้คีย์ต่างประเทศอื่น ๆ หรือไม่? ฉันขาดอะไรที่นี่?

8
เป็นคีย์ต่างประเทศเป็นคีย์หลักได้หรือไม่?
ฉันมีสองโต๊ะ: ผู้ใช้ (ชื่อผู้ใช้รหัสผ่าน) โปรไฟล์ (profileId, เพศ, วันเกิด, ... ) ขณะนี้ฉันกำลังใช้แนวทางนี้: แต่ละระเบียนโปรไฟล์มีฟิลด์ชื่อ "userId" เป็นคีย์ต่างประเทศซึ่งเชื่อมโยงไปยังตารางผู้ใช้ เมื่อผู้ใช้ลงทะเบียนบันทึกโปรไฟล์ของเขาจะถูกสร้างขึ้นโดยอัตโนมัติ ฉันสับสนกับคำแนะนำของฉันเพื่อน: จะมีฟิลด์ "หมายเลขผู้ใช้" เป็นชาวต่างชาติและหลักที่สำคัญและลบฟิลด์ "profileId" แนวทางไหนดีกว่ากัน?

2
Django: ตั้งค่าคีย์ต่างประเทศโดยใช้จำนวนเต็ม?
มีวิธีตั้งค่าความสัมพันธ์คีย์ต่างประเทศโดยใช้รหัสจำนวนเต็มของโมเดลหรือไม่? นี่จะเป็นไปเพื่อวัตถุประสงค์ในการเพิ่มประสิทธิภาพ ตัวอย่างเช่นสมมติว่าฉันมีรูปแบบพนักงาน: class Employee(models.Model): first_name = models.CharField(max_length=100) last_name = models.CharField(max_length=100) type = models.ForeignKey('EmployeeType') และ EmployeeType(models.Model): type = models.CharField(max_length=100) ฉันต้องการความยืดหยุ่นในการมีประเภทพนักงานไม่ จำกัด แต่ในแอปพลิเคชันที่ปรับใช้แล้วจะมีเพียงประเภทเดียวดังนั้นฉันจึงสงสัยว่ามีวิธีฮาร์ดโค้ดรหัสและตั้งค่าความสัมพันธ์ด้วยวิธีนี้หรือไม่ วิธีนี้ฉันสามารถหลีกเลี่ยงการเรียกฐานข้อมูลเพื่อรับวัตถุ EmployeeType ก่อน

13
รหัสข้อผิดพลาด: 1005 ไม่สามารถสร้างตาราง '…' (errno: 150)
ฉันค้นหาวิธีแก้ไขปัญหานี้บนอินเทอร์เน็ตและตรวจสอบคำถาม Stack Overflow แต่ไม่มีวิธีแก้ไขใดที่ใช้ได้กับกรณีของฉัน ฉันต้องการสร้างคีย์ต่างประเทศจากตาราง sira_no เป็น metal_kod ALTER TABLE sira_no ADD CONSTRAINT METAL_KODU FOREIGN KEY(METAL_KODU) REFERENCES metal_kod(METAL_KODU) ON DELETE SET NULL ON UPDATE SET NULL ; สคริปต์นี้ส่งคืน: Error Code: 1005. Can't create table 'ebs.#sql-f48_1a3' (errno: 150) ฉันพยายามเพิ่มดัชนีในตารางอ้างอิง: CREATE INDEX METAL_KODU_INDEX ON metal_kod (METAL_KODU); ฉันตรวจสอบ METAL_KODU บนทั้งสองตาราง (ชุดอักขระและการจัดเรียง) แต่ฉันไม่พบวิธีแก้ปัญหานี้ ฉันจะแก้ไขปัญหานี้ได้อย่างไร? …

6
จะเปลี่ยนการดำเนินการอ้างอิงคีย์ต่างประเทศได้อย่างไร (พฤติกรรม)
ฉันได้ตั้งค่าตารางที่มีคอลัมน์ที่มีคีย์ต่างประเทศตั้งค่าเป็นON DELETE CASCADE(ลบลูกเมื่อผู้ปกครองถูกลบ) คำสั่ง SQL จะเปลี่ยนเป็นON DELETE RESTRICTอะไร? (ไม่สามารถลบ parent ได้หากมีลูก)


20
MySQL การสร้างตารางด้วยคีย์ต่างประเทศให้ errno: 150
ฉันกำลังพยายามสร้างตารางใน MySQL ด้วยคีย์ต่างประเทศสองคีย์ซึ่งอ้างอิงคีย์หลักในอีก 2 ตาราง แต่ฉันได้รับข้อผิดพลาด errno: 150 และจะไม่สร้างตาราง นี่คือ SQL สำหรับทั้ง 3 ตาราง: CREATE TABLE role_groups ( `role_group_id` int(11) NOT NULL `AUTO_INCREMENT`, `name` varchar(20), `description` varchar(200), PRIMARY KEY (`role_group_id`) ) ENGINE=InnoDB; CREATE TABLE IF NOT EXISTS `roles` ( `role_id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50), `description` varchar(200), PRIMARY KEY …

8
วิธีสร้างความสัมพันธ์ใน MySQL
ในชั้นเรียนเราทุกคนกำลัง 'ศึกษา' ฐานข้อมูลและทุกคนใช้ Access เบื่อกับสิ่งนี้ฉันกำลังพยายามทำในสิ่งที่คลาสอื่น ๆ กำลังทำอยู่ แต่ใช้คำสั่ง SQL ดิบกับ MySQL แทนการใช้ Access ฉันจัดการสร้างฐานข้อมูลและตารางแล้ว แต่ตอนนี้ฉันจะสร้างความสัมพันธ์ระหว่างสองตารางได้อย่างไร ถ้าฉันมีสองตารางของฉันแบบนี้: CREATE TABLE accounts( account_id INT NOT NULL AUTO_INCREMENT, customer_id INT( 4 ) NOT NULL , account_type ENUM( 'savings', 'credit' ) NOT NULL, balance FLOAT( 9 ) NOT NULL, PRIMARY KEY ( account_id ) ) …


5
SqlAlchemy - กรองตามคุณสมบัติความสัมพันธ์
ฉันไม่มีประสบการณ์กับ SQLAlchemy มากนักและฉันมีปัญหาซึ่งฉันไม่สามารถแก้ไขได้ ฉันลองค้นหาและลองใช้รหัสมากมาย นี่คือคลาสของฉัน (ลดลงเป็นรหัสที่สำคัญที่สุด): class Patient(Base): __tablename__ = 'patients' id = Column(Integer, primary_key=True, nullable=False) mother_id = Column(Integer, ForeignKey('patients.id'), index=True) mother = relationship('Patient', primaryjoin='Patient.id==Patient.mother_id', remote_side='Patient.id', uselist=False) phenoscore = Column(Float) และฉันต้องการสอบถามผู้ป่วยทุกคนที่มีฟีโนสคอร์ของแม่ (ตัวอย่าง) == 10 อย่างที่บอกไปว่าฉันพยายามโค้ดหลายอย่าง แต่ไม่ได้รับ วิธีแก้ปัญหาในสายตาของฉันก็คือ patients = Patient.query.filter(Patient.mother.phenoscore == 10) เนื่องจากคุณสามารถเข้าถึง.mother.phenoscoreแต่ละองค์ประกอบได้เมื่อส่งออก แต่รหัสนี้ไม่ทำ มีความเป็นไปได้ (โดยตรง) ที่จะกรองตามแอตทริบิวต์ของความสัมพันธ์ (โดยไม่ต้องเขียนคำสั่ง SQL หรือคำสั่งเข้าร่วมเพิ่มเติม) …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.