คำถามติดแท็ก referential-integrity

สิ่งอำนวยความสะดวกที่จัดเตรียมโดยระบบจัดการฐานข้อมูลเพื่อให้แน่ใจว่าข้อมูลมีความสอดคล้องกัน

15
วิธีการติดตั้งแฟล็ก 'เริ่มต้น' ที่สามารถตั้งค่าได้ในแถวเดียวเท่านั้น
ตัวอย่างเช่นมีตารางที่คล้ายกับสิ่งนี้: create table foo(bar int identity, chk char(1) check (chk in('Y', 'N'))); มันไม่สำคัญว่าจะมีการนำธงไปใช้เป็นchar(1)a bitหรืออะไรก็ตาม ฉันแค่ต้องการให้สามารถบังคับใช้ข้อ จำกัด ที่สามารถตั้งค่าได้ในแถวเดียวเท่านั้น

2
ความแตกต่างระหว่าง MATCH FULL, MATCH SIMPLE และ MATCH PARTIAL?
ฉันสังเกตเห็นMATCH SIMPLEและMATCH FULLแต่ฉันไม่เข้าใจสิ่งที่พวกเขาทำ ฉันเห็นค่าเริ่มต้นคือMATCH SIMPLE; แต่MATCHข้ออื่น ๆในFOREIGN KEYฟังก์ชันข้อ จำกัด ได้อย่างไร

3
ข้อ จำกัด กุญแจต่างประเทศของสมาชิกอาเรย์?
สมมติว่าฉันมีตารางที่มีบทบาทงาน: CREATE TABLE roles ( "role" character varying(80) NOT NULL, CONSTRAINT "role" PRIMARY KEY (role) ); สมมติว่าฉันมีตารางผู้ใช้และแต่ละแถว (ผู้ใช้ที่ระบุ) สามารถมีบทบาทงานได้ตามอำเภอใจ: CREATE TABLE users ( username character varying(12) NOT NULL, roles character varying(80)[] NOT NULL, CONSTRAINT username PRIMARY KEY (username) ); ฉันควรแน่ใจว่าสมาชิกแต่ละคนusers.roles[]มีอยู่ใน role.role สำหรับฉันดูเหมือนว่าสิ่งที่ฉันต้องการคือข้อ จำกัด ที่สำคัญต่างประเทศของสมาชิกแต่ละคนของusers.roles[]สิ่งนั้นหากอ้างอิงถึง role.role ดูเหมือนจะเป็นไปไม่ได้เมื่อใช้ postgres ฉันกำลังดูวิธีนี้ผิดหรือเปล่า? อะไรคือวิธีที่ "ถูกต้อง" …

3
ข้อ จำกัด ในการบังคับใช้“ อย่างน้อยหนึ่ง” หรือ“ หนึ่งอย่าง” ในฐานข้อมูล
สมมติว่าเรามีผู้ใช้และผู้ใช้แต่ละคนสามารถมีที่อยู่อีเมลได้หลายที่อยู่ CREATE TABLE emails ( user_id integer, email_address text, is_active boolean ) แถวตัวอย่างบางส่วน user_id | email_address | is_active 1 | foo@bar.com | t 1 | baz@bar.com | f 1 | bar@foo.com | f 2 | ccc@ddd.com | t ฉันต้องการบังคับใช้ข้อ จำกัด ที่ผู้ใช้ทุกคนมีที่อยู่หนึ่งที่แน่นอน ฉันจะทำสิ่งนี้ใน Postgres ได้อย่างไร ฉันสามารถทำสิ่งนี้: CREATE UNIQUE INDEX "user_email" ON …

5
มี DBMS ที่อนุญาตให้ใช้ Foreign Key ที่อ้างอิงมุมมอง (และไม่เพียง แต่ตารางพื้นฐาน)?
แรงบันดาลใจจากการสร้างแบบจำลองคำถาม Django: การสร้างแบบจำลองฐานข้อมูลที่มีความสัมพันธ์หลายต่อหลายหลายใน Django การออกแบบ db เป็นสิ่งที่ชอบ: CREATE TABLE Book ( BookID INT NOT NULL , BookTitle VARCHAR(200) NOT NULL , PRIMARY KEY (BookID) ) ; CREATE TABLE Tag ( TagID INT NOT NULL , TagName VARCHAR(50) NOT NULL , PRIMARY KEY (TagID) ) ; CREATE TABLE BookTag ( BookID …

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

2
ข้อ จำกัด - หนึ่งแถวบูลีนเป็นจริงแถวอื่นทั้งหมดเป็นเท็จ
ฉันมีคอลัมน์: standard BOOLEAN NOT NULL ฉันต้องการบังคับใช้หนึ่งแถวจริงและอื่น ๆ ทั้งหมดเป็นเท็จ ไม่มีของ FK หรือสิ่งอื่นใดขึ้นอยู่กับข้อ จำกัด นี้ ฉันรู้ว่าฉันสามารถทำได้ด้วย plpgsql แต่ดูเหมือนว่าค้อนขนาดใหญ่ ฉันต้องการบางสิ่งบางอย่างเช่นCHECKหรือUNIQUEข้อ จำกัด ง่ายกว่าดีกว่า แถวหนึ่งต้องเป็นจริงพวกเขาไม่สามารถเป็นเท็จได้ทั้งหมด (ดังนั้นแถวแรกที่แทรกจะต้องเป็นจริง) แถวจะต้องได้รับการอัปเดตซึ่งหมายความว่าฉันต้องรอตรวจสอบข้อ จำกัด จนกว่าการอัปเดตจะเสร็จสิ้นเนื่องจากแถวทั้งหมดอาจถูกตั้งค่าเป็นเท็จก่อนและหนึ่งแถวจริงหลังจากนั้น มี FK ระหว่างproducts.tax_rate_idและtax_rate.idแต่ไม่มีอะไรเกี่ยวข้องกับอัตราภาษีเริ่มต้นหรือมาตรฐานซึ่งผู้ใช้สามารถเลือกเพื่อสร้างผลิตภัณฑ์ใหม่ได้อย่างง่ายดาย .. PostgreSQL 9.5 ถ้าเป็นเรื่องสำคัญ พื้นหลัง ตารางคืออัตราภาษี อัตราภาษีอย่างใดอย่างหนึ่งคือค่าเริ่มต้น ( standardเนื่องจากค่าเริ่มต้นคือคำสั่ง Postgres) เมื่อมีการเพิ่มผลิตภัณฑ์ใหม่อัตราภาษีมาตรฐานจะถูกนำไปใช้กับผลิตภัณฑ์ หากไม่มีstandardอยู่ฐานข้อมูลต้องทำการเดาหรือเช็คที่ไม่จำเป็นทุกชนิด standardทางออกที่ง่ายผมคิดว่าคือการทำให้แน่ใจว่ามี ตามค่าเริ่มต้น "" ด้านบนฉันหมายถึงเลเยอร์การนำเสนอ (UI) มีตัวเลือกผู้ใช้สำหรับการเปลี่ยนแปลงอัตราภาษีเริ่มต้น ฉันต้องเพิ่มการตรวจสอบพิเศษเพื่อให้แน่ใจว่า GUI / ผู้ใช้ไม่พยายามตั้งค่า tax_rate_id …

3
เรียงซ้อนการอัปเดตคีย์หลักเป็นคีย์ต่างประเทศที่อ้างอิงทั้งหมด
เป็นไปได้หรือไม่ที่จะอัพเดตค่าคอลัมน์คีย์หลักที่มีการเรียงซ้อนการอัพเดตระหว่างคีย์ต่างประเทศทั้งหมดที่อ้างถึง? # แก้ไข 1: เมื่อฉันเรียกใช้แบบสอบถาม followinq select * from sys.foreign_keys where referenced_object_id=OBJECT_ID('myTable') ฉันเห็นว่า update_referential_action ตั้งเป็น 0 ดังนั้นจะไม่มีการดำเนินการใด ๆ หลังจากอัปเดตคอลัมน์คีย์หลักของฉัน ฉันจะอัปเดตคีย์ต่างประเทศเพื่อใช้เป็นCASCADE UPDATE ได้อย่างไร # EDIT 2: เพื่อให้สคริปต์ออกสร้างหรือวางกุญแจต่างประเทศทั้งหมดในสคีมาของคุณให้เรียกใช้สคริปต์ต่อไปนี้ (นำมาจากที่นี่ ) DECLARE @schema_name sysname; DECLARE @table_name sysname; DECLARE @constraint_name sysname; DECLARE @constraint_object_id int; DECLARE @referenced_object_name sysname; DECLARE @is_disabled bit; DECLARE @is_not_for_replication bit; DECLARE …

4
คำสั่ง DELETE ขัดแย้งกับข้อ จำกัด การอ้างอิง
สถานการณ์ของฉันเป็นดังนี้: ตาราง STOCK_ARTICLES: ID *[PK]* OTHER_DB_ID ITEM_NAME ตาราง LOCATION: ID *[PK]* LOCATION_NAME ตาราง WORK_PLACE: ID *[PK]* WORKPLACE_NAME ตาราง INVENTORY_ITEMS: ID *[PK]* ITEM_NAME STOCK_ARTICLE *[FK]* LOCATION *[FK]* WORK_PLACE *[FK]* 3 FKs ใน INVENTORY_ITEMS อ้างอิงคอลัมน์ "ID" ในตารางอื่น ๆ ที่เกี่ยวข้องอย่างชัดเจน ตารางที่เกี่ยวข้องที่นี่คือ STOCK_ARTICLE และ INVENTORY_ITEMS ขณะนี้มีงาน SQL ประกอบด้วยหลายขั้นตอน (สคริปต์ SQL) ที่ "ประสาน" ฐานข้อมูลที่กล่าวถึงข้างต้นกับฐานข้อมูลอื่น (OTHER_DB) …

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 …

2
ฉันต้องมีคอลัมน์รหัสแยกต่างหากสำหรับตาราง "การแมป" นี้หรือไม่
ฉันมีตารางProducersและตารางProductsซึ่งทั้งสองอย่างนี้มีรูปแบบ: Id - int คีย์หลัก Name - nvarchar ผู้ผลิตสามารถบรรทุกผลิตภัณฑ์ได้หลายตัวดังนั้นฉันจะสร้างตารางที่เรียกProducerDetailsว่าจะมี: ProducerId - int, foreign key to Producers.Id ProductId - int, foreign key to Products.Id จากนั้นฉันก็เริ่มตั้งคำถามกับตัวเองดังนั้นฉันจึงคิดว่าฉันจะถามผู้เชี่ยวชาญ การออกแบบฐานข้อมูลจะดีกว่าหรือไม่หากมีIdคอลัมน์เพิ่มเติม(int, คีย์หลัก) ในProducerDetailsตารางของฉัน หรือว่าไม่จำเป็น? ฉันใช้ SQL-Server 2008 R2 ถ้านั่นสร้างความแตกต่างได้เลย แก้ไข - ความสัมพันธ์ระหว่างตารางเหล่านี้จะเป็นแบบกลุ่มต่อกลุ่มฉันเชื่อว่าขอโทษที่ฉันไม่ได้บอกอย่างชัดเจน ผู้ผลิตสามารถดำเนินการผลิตภัณฑ์หลายประเภทและผลิตภัณฑ์เดียวกันสามารถผลิตได้โดยผู้ผลิตหลายราย ฉันขอโทษถ้าคำถามนี้ง่ายเกินไปการออกแบบความสมบูรณ์ของการอ้างอิง / ฐานข้อมูลไม่ใช่จุดแข็งของฉัน (แม้ว่าฉันจะพยายามปรับปรุงมัน)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.