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

ชนิดของข้อ จำกัด ด้านความสมบูรณ์ที่ใช้ในแพลตฟอร์ม RDBMS เพื่อให้แน่ใจว่าค่าในคอลัมน์ตรงกับช่วงหนึ่งของค่าคีย์จากตารางอื่น

2
ฉันควรเพิ่มคีย์ต่างประเทศสกรรมกริยาหรือไม่
ตัวอย่างง่ายๆ: มีตารางลูกค้า create table Customers ( id integer, constraint CustomersPK primary key (id) ) ข้อมูลอื่น ๆ ทั้งหมดในฐานข้อมูลควรเชื่อมโยงไปยัง a Customerดังนั้นเช่นOrdersจะมีลักษณะดังนี้: create table Orders ( id integer, customer integer, constraint OrdersPK primary key (customer, id), constraint OrdersFKCustomers foreign key (customer) references Customers (id) ) สมมติว่าตอนนี้มีตารางเชื่อมโยงไปยังOrders: create table Items ( id integer, customer …

1
วิธีการเชื่อมโยงสองแถวในตารางเดียวกัน
ฉันมีตารางที่แถวสามารถเชื่อมโยงซึ่งกันและกันและตามหลักเหตุผลความสัมพันธ์ไปทั้งสองทาง (โดยทั่วไปไม่มีทิศทาง) ระหว่างสองแถว (และหากคุณสงสัยว่าใช่นี่ควรเป็นหนึ่งตารางมันเป็นสองสิ่งที่มีเอนทิตี / ประเภทตรรกะที่เหมือนกัน) ฉันสามารถคิดถึงวิธีที่จะแสดงสิ่งนี้: เก็บความสัมพันธ์และสิ่งที่ตรงกันข้าม จัดเก็บความสัมพันธ์ทางเดียว จำกัด ฐานข้อมูลจากการจัดเก็บในทางอื่นและมีดัชนีสองรายการที่มีคำสั่งตรงกันข้ามสำหรับ FKs (ดัชนีหนึ่งรายการเป็นดัชนี PK) จัดเก็บความสัมพันธ์ทางเดียวด้วยดัชนีสองรายการและอนุญาตให้แทรกสองวิธีต่อไปได้ สร้างตารางการจัดกลุ่มบางประเภทและมี FK ไว้ในตารางต้นฉบับ (เพิ่มคำถามจำนวนมากตารางการจัดกลุ่มจะมีตัวเลขเท่านั้นเพราะเหตุใดถึงมีตารางทำให้ FK NULLable หรือมีกลุ่มที่มีแถวเดียวเชื่อมโยงกัน) อะไรคือข้อดีและข้อเสียที่สำคัญของวิธีการเหล่านี้และแน่นอนมีวิธีที่ฉันไม่เคยคิดบ้างไหม? นี่เป็น SQLFiddle จะเล่นกับ: http://sqlfiddle.com/#!12/7ee1a/1/0 (เกิดขึ้นเป็น PostgreSQL เนื่องจากเป็นสิ่งที่ฉันใช้ แต่ฉันไม่คิดว่าคำถามนี้เฉพาะเจาะจงมากกับ PostgreSQL) ปัจจุบันมีการจัดเก็บทั้งความสัมพันธ์และย้อนกลับเป็นตัวอย่าง

3
มีเอ็นจิ้นฐานข้อมูลใดที่จะไม่เหมาะสมกับเงื่อนไขการเข้าร่วมตามคีย์ต่างประเทศที่มีอยู่
มันแปลกสำหรับฉันที่เมื่อฉันกำหนดคีย์ต่างประเทศแล้วเอ็นจินไม่สามารถใช้ข้อมูลนี้เพื่อค้นหานิพจน์ JOIN ที่ถูกต้องโดยอัตโนมัติ แต่ต้องการให้ฉันพิมพ์ประโยคเดิมซ้ำอีกครั้ง มีฐานข้อมูลใดบ้างหรืออาจเป็นโครงการวิจัยบางประเภทที่จะตรวจสอบคีย์ต่างประเทศที่มีอยู่

4
วิธีเพิ่มคอลัมน์ที่มีข้อ จำกัด foreign key ไปยังตารางที่มีอยู่แล้ว?
ฉันมีตารางต่อไปนี้ CREATE TABLE users (id int PRIMARY KEY); -- already exists with data CREATE TABLE message (); ฉันจะเปลี่ยนmessagesตารางเช่นนั้นได้อย่างไร คอลัมน์ใหม่ที่เรียกว่าsenderถูกเพิ่มเข้าไป โดยที่senderเป็น foreign key อ้างอิงusersตาราง สิ่งนี้ไม่ทำงาน # ALTER TABLE message ADD FOREIGN KEY (sender) REFERENCES users; ERROR: column "sender" referenced in foreign key constraint does not exist คำสั่งนี้ไม่ได้สร้างคอลัมน์ด้วยหรือไม่?

2
จะใช้ RESTRICT สำหรับ Foreign Key ใน mysql ได้อย่างไร
ในโครงสร้างฐานข้อมูลของ CREATE TABLE Country ( name varchar(40) NOT NULL, PRIMARY KEY (name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE City ( name varchar(40) NOT NULL, PRIMARY KEY (name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE Map ( country varchar(40) NOT NULL, city varchar(100) NOT NULL, PRIMARY KEY (country,city), FOREIGN KEY (country) REFERENCES …

3
การใช้ความสัมพันธ์แบบหนึ่งถึงศูนย์หรือหนึ่งความสัมพันธ์ใน SQL
ให้เราบอกว่าฉันกำลังออกแบบฐานข้อมูลสำหรับสถานการณ์ที่มีความสัมพันธ์แบบหนึ่งต่อศูนย์หรือหนึ่ง (1-0..1) ตัวอย่างเช่น: มีชุดของเป็นผู้ใช้และบาง ผู้ใช้ก็อาจจะเป็นลูกค้า ดังนั้นฉันจึงสร้างตารางที่สอดคล้องกันสองตารางusersและcustomersแต่ ... ... วิธีที่ดีที่สุดในการแสดงและนำสถานการณ์นี้ไปใช้ในแพลตฟอร์ม SQL ที่กำหนดคืออะไร ฉันได้พิจารณาวิธีแก้ปัญหาที่เป็นไปได้สองข้อแล้ว: ในusersตารางเพิ่มcustomerคอลัมน์ซึ่งอาจเป็นการอ้างอิงคีย์ต่างประเทศcustomersหรือNULLเครื่องหมาย ในcustomersตารางรวมuserคอลัมน์ (ตั้งค่าด้วยUNIQUEข้อ จำกัด ) ซึ่งชี้ไปที่usersตาราง ฉันได้ถามคำถามที่คล้ายกันในฟอรัมแล้ว แต่คำตอบก็คือ "สิ่งที่คุณต้องการ", "อะไรก็ตามที่คุณคิดว่าสะดวก" ฉันไม่ชอบคำตอบแบบนี้ ฉันต้องการทฤษฎี DB ที่จริงจังแทนคำตอบที่ได้รับการยอมรับอย่างดี ฉันจะอ่านความสัมพันธ์เกี่ยวกับ 1-0..1 ได้ที่ไหน

5
การใช้คีย์ต่างประเทศหลายรายการในคอลัมน์เดียวกันใน SQL Server
SQL Server อนุญาตให้ฉันสร้างคีย์ต่างประเทศหลายอันในคอลัมน์และแต่ละครั้งที่ใช้ชื่อต่างกันฉันสามารถสร้างคีย์อื่นที่อ้างอิงถึงวัตถุเดียวกันได้ โดยทั่วไปกุญแจทั้งหมดจะกำหนดความสัมพันธ์เดียวกัน ฉันต้องการที่จะรู้ว่าสิ่งที่ใช้มีคีย์ต่างประเทศหลายที่กำหนดไว้ในคอลัมน์เดียวกันและอ้างอิงถึงคอลัมน์เดียวกันในตารางอื่น ประโยชน์ของมันคืออะไรที่ SQL Server อนุญาตให้เราทำสิ่งนั้น

2
ทำไมคีย์ต่างประเทศแบบคอมโพสิตจึงจำเป็นต้องมีข้อ จำกัด ที่ไม่เหมือนกัน?
นี่คือตารางอย่างง่าย ๆ ที่เรคคอร์ดอาจอ้างอิงเรคคอร์ดหลักในตารางเดียวกัน: CREATE TABLE foo ( id SERIAL PRIMARY KEY, parent_id INT NULL, num INT NOT NULL, txt TEXT NULL, FOREIGN KEY (parent_id) REFERENCES foo(id) ); ด้วยข้อกำหนดเพิ่มเติมที่หนึ่งในค่าเขตข้อมูลอื่น ( num) จะต้องเหมือนกันระหว่างบันทึกผู้ปกครองและเด็กฉันคิดว่าคีย์ต่างประเทศประกอบควรทำเคล็ดลับ ฉันเปลี่ยนบรรทัดสุดท้ายเป็น FOREIGN KEY (parent_id, num) REFERENCES foo(id, num) และมีข้อผิดพลาด: ไม่มีข้อ จำกัด ที่ไม่ซ้ำกันการจับคู่ปุ่มรับสำหรับตารางการอ้างอิง "foo" ฉันสามารถเพิ่มข้อ จำกัด นี้ได้อย่างง่ายดาย แต่ฉันไม่เข้าใจว่าทำไมจึงมีความจำเป็นเมื่อหนึ่งในคอลัมน์ที่อ้างอิง ( id) …

1
จะปิดการใช้งานคีย์ต่างประเทศชั่วคราวใน Amazon RDS PostgreSQL ได้อย่างไร
ฉันกำลังย้ายสภาพแวดล้อมการทดสอบที่มีอยู่ไปที่ Amazon RDS PostgreSQL เฟรมเวิร์กการทดสอบมีคุณลักษณะของการโหลดข้อมูลในบางตารางเป็นสถานะก่อนหน้า สำหรับสิ่งนี้จะปิดใช้งานคีย์ต่างประเทศลบข้อมูลที่มีอยู่โหลดบันทึกสถานะและเปิดใช้งานคีย์ต่างประเทศอีกครั้ง ปัจจุบันกรอบการทดสอบปิดการใช้งานคีย์ต่างประเทศโดยการปิดการใช้งานทริกเกอร์ทั้งหมด (แน่นอนต้องใช้ superuser): alter table tablename disable trigger all; ใน RDS สิ่งนี้ล้มเหลวด้วย: ข้อผิดพลาด: สิทธิ์ที่ถูกปฏิเสธ: "RI_ConstraintTrigger_a_20164" เป็นตัวกระตุ้นระบบ ฉันจะปิดใช้งานคีย์ต่างประเทศชั่วคราวใน Amazon RDS PostgreSQL ได้อย่างไร หมายเหตุ: คำถามที่คล้ายกันได้ถูกถามแล้ว ( PostgreSQL บน RDS: วิธีการนำเข้าข้อมูลจำนวนมากด้วยข้อ จำกัด FK? ) แต่เป็นเฉพาะเกี่ยวกับการนำเข้าแบบออฟไลน์และการแก้ปัญหาเฉพาะสำหรับการนำเข้าแบบออฟไลน์ด้วย

1
การบังคับใช้ข้อ จำกัด “ ออกไปสองตาราง”
ฉันพบปัญหาในการสร้างแบบจำลองวงจรไฟฟ้าใน SQL โครงสร้างที่ฉันต้องการจะจับคือ part ←────────── pin ↑ ↑ part_inst ←───── pin_inst โดยที่ "inst" สั้นสำหรับ "อินสแตนซ์" ยกตัวอย่างเช่นผมอาจจะมีเป็นpartLM358 op-amp กับpins 1OUT, 1IN-, 1in + GND, 2in + 2IN-, 2OUT และ V CC จากนั้นฉันอาจวางส่วนนี้ลงบนแผนผังสร้างpart_instและ 8 pin_instวินาที ละเว้นเขตข้อมูลความพยายามครั้งแรกของฉันที่ schema คือ create table parts ( part_id bigserial primary key ); create table pins ( pin_id …

3
วิธีการดึงข้อมูลข้อ จำกัด คีย์ต่างประเทศ
ฉันกำลังมองหาข้อความค้นหาที่อนุญาตให้ดึงข้อมูลคีย์ต่างประเทศ (แต่ละบรรทัด: ตารางอ้างอิงและฟิลด์, ตารางอ้างอิงและฟิลด์อ้างอิง) ของสคีมาทั้งหมด ฉันได้พบสิ่งนี้แล้ว แต่ไม่ได้ให้ข้อมูลทั้งหมดที่ฉันต้องการ: /programming/4389228/sql-for-oracle-to-check-if-a-constraint-export ขณะนี้ฉันกำลังดำเนินการอยู่และอาจสิ้นสุดด้วยวิธีแก้ไขปัญหาในนาที / ชั่วโมงถัดไป แต่ถ้าใครมีวิธีแก้ปัญหาการทำงานที่สมบูรณ์แล้วฉันจะดีใจที่ได้รู้ :)

2
มุมมองจำเป็นต้องมีข้อ จำกัด กุญแจต่างประเทศของตัวเองหรือไม่?
คำเตือน: ฉันเป็นโปรแกรมเมอร์ไม่ใช่ DBA ดังนั้นทนกับฉัน ... ฉันมีมุมมองที่ฉันใช้เพื่อจับคู่เอนทิตี 2 รายการเข้าด้วยกัน ฉันต้องเข้าร่วมระหว่างตารางที่แตกต่างกันสองสามเพื่อให้ได้: CREATE OR REPLACE VIEW V_SCREENING_GROUP_SITES AS ( SELECT SG.SCREENING_GROUP_ID, V.SITE_ID FROM SCREENING_GROUP SG, VISIT V, VISIT_DATE VD WHERE VD.VISIT_ID = V.VISIT_ID AND V.SCREENING_GROUP_ID = SG.SCREENING_GROUP_ID); ด้านบนเป็นเพียงบริบทไม่ต้องกังวลมากเกินไป สิ่งที่ฉันต้องรู้คือวิธีสร้างฟิลด์ในมุมมอง V_SCREENING_GROUP_SITES ใหม่ของฉัน (SCREENING_GROUP_ID และ SITE_ID) ทำหน้าที่เป็นคีย์ต่างประเทศในตาราง SCREENING_GROUP และ SITE หรือว่ามันสำคัญ ถ้าเป็นตารางฉันจะทำ: ALTER TABLE V_SCREENING_GROUP_SITES …

2
เปลี่ยนดัชนีอ้างอิงสำหรับ Foreign Key
ฉันมีสิ่งนี้: CREATE TABLE T1 ( Id INT ... ,Constraint [PK_T1] PRIMARY KEY CLUSTERED [Id] ) CREATE TABLE T2 ( .... ,T1_Id INT NOT NULL ,CONSTRAINT [FK_T2_T1] FOREIGN KEY (T1_Id) REFERENCES T1(Id) ) เพื่อเหตุผลด้านประสิทธิภาพ (และการหยุดชะงัก) เหตุผลที่ฉันสร้างดัชนีใหม่บน T1 CREATE UNIQUE NONCLUSTERED INDEX IX_T1_Id ON T1 (Id) แต่ถ้าฉันตรวจสอบว่าดัชนีอ้างอิง FK ใดให้อ้างอิงไปยังดัชนีคลัสเตอร์ select ix.index_id, ix.name …

1
การออกแบบโครงสร้างฐานข้อมูลมิตรภาพ: ฉันควรใช้คอลัมน์ที่มีหลายค่าหรือไม่
ว่าฉันมีตารางที่เรียกว่าUser_FriendListซึ่งมีลักษณะดังต่อไปนี้: CREATE TABLE User_FriendList ( ID ..., User_ID..., FriendList_IDs..., CONSTRAINT User_Friendlist_PK PRIMARY KEY (ID) ); และให้เราสมมติว่าตารางดังกล่าวถือข้อมูลต่อไปนี้: + ---- + --------- + --------------------------- + | ID | User_ID | Friendlist_ID | + ---- + --------- + --------------------------- + | 1 | 102 | 2: 15: 66: 35: 26: 17: | + …

3
zero-or-one ถึง zero-or-one
ฉันจะสร้างความสัมพันธ์แบบ zero-or-one ถึง zero-or-one ใน SQL Server เป็นวิธีที่เป็นธรรมชาติที่สุดได้อย่างไร มีตาราง 'อันตราย' ที่แสดงอันตรายบนไซต์ มีตาราง 'งาน' สำหรับงานที่ต้องทำบนไซต์ งานบางอย่างเพื่อแก้ไขอันตรายไม่มีงานใดที่สามารถจัดการกับอันตรายหลายอย่างได้ อันตรายบางอย่างมีหน้าที่แก้ไข ไม่มีอันตรายใด ๆ ที่เกี่ยวข้องกับภารกิจทั้งสองได้ ด้านล่างเป็นสิ่งที่ดีที่สุดที่ฉันนึกได้: CREATE TABLE [dbo].[Hazard]( [HazardId] [int] IDENTITY(1,1) NOT NULL, [TaskId] [int] NULL, [Details] [varchar](max) NULL, CONSTRAINT [PK_Hazard] PRIMARY KEY CLUSTERED ( [HazardId] ASC )) GO ALTER TABLE [dbo].[Hazard] WITH CHECK ADD …

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