मैं विदेशी कुंजी का उपयोग केवल सफल होने के लिए सम्मिलित/अद्यतन क्वेरी को बाध्य करने के लिए कैसे कर सकता हूं यदि विदेशी कुंजी डेटा वास्तव में उस उपयोगकर्ता से संबंधित है जो सम्मिलित/अद्यतन कर रहा है।

उदाहरण के लिए, उपयोगकर्ता 1 द्वारा बनाई गई श्रेणी का उपयोग उपयोगकर्ता 2 द्वारा नहीं किया जा सकता है और इसके विपरीत क्रॉस-एक्सेस को अस्वीकार करने के लिए उपयोग नहीं किया जा सकता है।

Create Table Users(
    user_id int not null AUTO_INCREMENT,
    user_name varchar(50) not null,
    city varchar(50) default null,
    PRIMARY KEY (user_id)
);

-- Insert users
Insert into Users(user_name, city) Values('Nick', 'New york');
Insert into Users(user_name, city) Values('John', 'Seattle');

श्रेणियां बनाएं

Create Table Categories(
    category_id int not null AUTO_INCREMENT,
    user_id int not null,
    category_name varchar(50) not null,
    PRIMARY KEY (category_id),
  CONSTRAINT FK_CategoryUser FOREIGN KEY (user_id) REFERENCES Users(user_id)  
);

-- Insert category for Nick with user_id = 1
Insert into Categories(user_id, category_name) Values(1, 'Travel');

-- Insert category for John user_id = 2
Insert into Categories(user_id, category_name) Values(2, 'Science');

किताबें बनाएं

Create Table Books(
    book_id int not null AUTO_INCREMENT,
    user_id int not null,
    category_id int default null,    
    book_name varchar(50) not null,
    book_type varchar(50) not null,
    PRIMARY KEY (book_id),
  CONSTRAINT FK_BookUser FOREIGN KEY (user_id) REFERENCES Users(user_id),
  CONSTRAINT FK_BookCategory FOREIGN KEY (category_id) REFERENCES Categories(category_id)
);

अब निक के लिए इंसर्ट बुक MUST FAIL क्योंकि category_id = 2 पंक्ति वाली "विज्ञान" श्रेणी जॉन की है user_id = 1

Insert into Books(user_id, category_id, book_name, book_type)
Values(1, 2, 'My science book', 'online')
1
Vikash Rathee 2 फरवरी 2021, 17:22
ALTER TABLE Books ADD UNIQUE KEY (category_id); इससे पुस्तकों में एक से अधिक पंक्तियों के लिए एक निश्चित category_id होना एक त्रुटि हो जाती है। इसलिए केवल एक उपयोगकर्ता प्रत्येक श्रेणी का उपयोग कर सकता है।
 – 
Bill Karwin
2 फरवरी 2021, 18:09
यह सही नहीं है। जो उपयोगकर्ता इस श्रेणी का स्वामी है उसे उस श्रेणी के लिए और पुस्तकें जोड़ने में सक्षम होना चाहिए ताकि वह इसे विशिष्ट न बना सके। मुझे केवल उन अन्य उपयोगकर्ताओं को सीमित करने की आवश्यकता है जो उस श्रेणी के स्वामी नहीं हैं।
 – 
Vikash Rathee
2 फरवरी 2021, 18:15

1 उत्तर

सबसे बढ़िया उत्तर

चूँकि आपके पास Categories.user_id है, आप इसे एक कुंजी बना सकते हैं:

ALTER TABLE Categories ADD UNIQUE KEY (user_id, category_id);

फिर इसे पुस्तकें तालिका से देखें:

ALTER TABLE Books ADD FOREIGN KEY (user_id, category_id) 
  REFERENCES Categories (user_id, category_id);

इसके लिए यह आवश्यक है कि किसी उपयोगकर्ता को एक पुस्तक तभी दी जाए जब उस उपयोगकर्ता को संबंधित श्रेणी सौंपी गई हो। लेकिन यह एक ही उपयोगकर्ता और श्रेणी जोड़ी के साथ पुस्तकों में कई पंक्तियों की अनुमति देता है।

श्रेणियों में नई कुंजी को एक अद्वितीय कुंजी बनाना बेमानी लगता है, क्योंकि केवल category_id पहले से ही अद्वितीय है। लेकिन सामान्य SQL भाषा में, एक विदेशी कुंजी को UNIQUE KEY का संदर्भ देना चाहिए।

0
Bill Karwin 2 फरवरी 2021, 19:15