এসকিউএল সার্ভার সন্নিবেশ করানো না থাকলে সেরা অনুশীলন


152

আমার কাছে Competitionsফলাফলের ছক রয়েছে যা একদিকে দলের সদস্যের নাম এবং তাদের র‌্যাঙ্কিং ধারণ করে।

অন্যদিকে আমার অনন্য প্রতিযোগীদের নামের একটি সারণী বজায় রাখা দরকার :

CREATE TABLE Competitors (cName nvarchar(64) primary key)

এখন আমি প্রথম টেবিলে এবং প্রতিযোগীদের টেবিলটি খালি থাকলে আমার প্রায় 200,000 ফলাফল রয়েছে আমি এটি সম্পাদন করতে পারি:

INSERT INTO Competitors SELECT DISTINCT Name FROM CompResults

এবং ক্যোয়ারিতে প্রায় 11,000 নাম .োকাতে কেবল 5 সেকেন্ড সময় লাগে।

এখন পর্যন্ত এটি একটি সমালোচনামূলক অ্যাপ্লিকেশন নয় তাই আমি বিবেচনা করতে পারি মাসে প্রতিযোগীদের টেবিলটি কাটা , যখন আমি প্রায় 10,000 সারি নিয়ে নতুন প্রতিযোগিতার ফলাফল পাই receive

তবে নতুন এবং বিদ্যমান প্রতিযোগীদের সাথে নতুন ফলাফল যুক্ত হওয়ার পরে সর্বোত্তম অনুশীলনটি কী? আমি বিদ্যমান প্রতিযোগীদের টেবিলটি কাটাতে চাই না

আমার কেবল নতুন প্রতিযোগীদের জন্য INSERT বিবৃতি সম্পাদন করা দরকার এবং সেগুলি উপস্থিত থাকলে কিছুই করব না।


70
দয়া করে, না একটি করতে NVARCHAR(64)কলাম আপনার প্রাথমিক (এবং এইভাবে: ক্লাস্টারিং) কী !! প্রথমত - এটি একটি খুব প্রশস্ত কী - 128 বাইট অবধি; এবং দ্বিতীয়ত এটি পরিবর্তনশীল আকার - আবার: সর্বোত্তম নয় ... এটি আপনার নিকৃষ্টতম পছন্দ সম্পর্কে হতে পারে - আপনার সম্পাদনাটি নরক হবে, এবং টেবিল এবং সূচী বিভাজন সর্বদা 99.9% এ থাকবে .....
মার্ক_স

4
মার্ক একটি ভাল পয়েন্ট আছে। আপনার পিকে হিসাবে নাম ব্যবহার করবেন না। একটি আইডি, পছন্দসই ইনট বা হালকা ওজনের কিছু ব্যবহার করুন।
সমৃদ্ধ

6
দেখুন Kimberly Tripp এর ব্লগ পোস্টে কি একটি করে তোলে ভাল স্ট্যাটিক, সদা বৃদ্ধি অনন্য, সংকীর্ণ: ক্লাস্টারিং কী। cNameচারটি বিভাগের তিনটিতে আপনার ব্যর্থতা .... (এটি সংকীর্ণ নয়, সম্ভবত এটি স্থির নয়, এবং এটি অবশ্যই ক্রমবর্ধমান নয়)
marc_s

প্রতিযোগীর নাম টেবিলটিতে INT প্রাথমিক কী যুক্ত করার বিন্দুটি আমি দেখতে পাচ্ছি না যেখানে '% xxxxx%' এর মতো 'WHEE নাম' এর মতো সমস্ত প্রশ্নের নাম থাকবে, তাই নামটিতে আমার সর্বদা অনন্য সূচী প্রয়োজন। তবে হ্যাঁ, আমি এটিকে পরিবর্তনশীল দৈর্ঘ্য না করার পয়েন্টটি দেখতে পাচ্ছি ..
ডিডিয়ার লেভি

3
ক) টুকরো টুকরো টুকরো করা এবং খ) যদি এটি অন্য টেবিলে বিদেশী কী হয় তবে ডুপ্লিকেট করা তথ্যগুলি
নেসেসারি

উত্তর:


213

শব্দার্থকভাবে আপনি "প্রতিযোগীদের সন্নিবেশ করান যেখানে ইতিমধ্যে উপস্থিত নেই" জিজ্ঞাসা করছেন:

INSERT Competitors (cName)
SELECT DISTINCT Name
FROM CompResults cr
WHERE
   NOT EXISTS (SELECT * FROM Competitors c
              WHERE cr.Name = c.cName)

2
ঠিক আছে, এসও-তে প্রশ্ন উত্থাপনের আগে আমি এই কাজটি করতাম। তবে আমার চিন্তার মূল বিষয়: সপ্তাহে একবারে স্ক্র্যাচ থেকে নাম টেবিলটি পুনর্নির্মাণের বিরুদ্ধে এটি কতটা ভাল সম্পাদন করবে? (মনে রাখবেন এটি কেবল কয়েক সেকেন্ড সময় নেয়)
ডিডিয়ার লেভি

3
@ ডিডিয়ার লেভি: দক্ষতা? কেন কাটা, পুনরায় তৈরি করুন যখন আপনি কেবলমাত্র পার্থক্যগুলি আপডেট করতে পারেন। এটি হ'ল: শুরু করুন ট্রেন মুছে ফেলুন সংক্ষেপণগুলি অন্তর্ভুক্ত করুন .. কমিট ট্রান = আরও কাজ।
জিবিএন

@gbn - এখানে আপনার উত্তরের পরিবর্তে নিরাপদে যদি অন্য কোনও যুক্তি ব্যবহার করার উপায় থাকে? আমার একটি সম্পর্কিত প্রশ্ন আছে আপনি কি আমাকে এটি সাহায্য করতে পারেন? stackoverflow.com/questions/21889843/…
বাষ্প

53

আরেকটি বিকল্প হ'ল আপনার বিদ্যমান প্রতিযোগীদের সারণীর সাথে আপনার ফলাফলের টেবিলে যোগ দিতে বামে থাকুন এবং যোগদানের সাথে মেলে না এমন স্বতন্ত্র রেকর্ডগুলি ফিল্টার করে নতুন প্রতিযোগীদের সন্ধান করুন:

INSERT Competitors (cName)
SELECT  DISTINCT cr.Name
FROM    CompResults cr left join
        Competitors c on cr.Name = c.cName
where   c.cName is null

নতুন সিনট্যাক্স মার্জ এছাড়াও এটি করার জন্য একটি কমপ্যাক্ট, মার্জিত এবং দক্ষ উপায় প্রস্তাব করে:

MERGE INTO Competitors AS Target
USING (SELECT DISTINCT Name FROM CompResults) AS Source ON Target.Name = Source.Name
WHEN NOT MATCHED THEN
    INSERT (Name) VALUES (Source.Name);

1
মার্জ এক্ষেত্রে দুর্দান্ত, এটি যা বলে ঠিক তা করে।
VorobeY1326

সাব-কোয়ের পদ্ধতির বিপরীতে এসকিউএল সার্ভারকে অনুকূলকরণের জন্য সেরা সম্ভাব্য ইঙ্গিত প্রদানের মাধ্যমে আমি নিশ্চিতভাবে এটি বিশ্বাস করি।
ম্যাডস নীলসন

4
MERGE বিবৃতিতে এখনও অনেকগুলি সমস্যা রয়েছে। শুধু গুগল "এসকিউএল মার্জ সমস্যা" - অনেক ব্লগার এটি দৈর্ঘ্যে আলোচনা করেছেন।
ডেভিড উইলসন

মার্জ বিবৃতিতে লক্ষ্য হিসাবে কেন, তবে ইনসার্টের বিবৃতিতে কোনও লক্ষ্য নেই? আরও বেশি পার্থক্য রয়েছে যা সমতাটি উপলব্ধি করা শক্ত করে তোলে।
পিটার

32

কেন অন্য কেউ এটি এখনও বলেন নি;

স্বাভাবিক।

আপনি একটি টেবিল পেয়েছেন যে প্রতিযোগিতা মডেল? প্রতিযোগীরা কি প্রতিযোগীদের সমন্বয়ে গঠিত? এক বা একাধিক প্রতিযোগিতায় আপনার প্রতিযোগীদের আলাদা তালিকা দরকার ......

আপনার নিম্নলিখিত টেবিল থাকা উচিত .....

CREATE TABLE Competitor (
    [CompetitorID] INT IDENTITY(1,1) PRIMARY KEY
    , [CompetitorName] NVARCHAR(255)
    )

CREATE TABLE Competition (
    [CompetitionID] INT IDENTITY(1,1) PRIMARY KEY
    , [CompetitionName] NVARCHAR(255)
    )

CREATE TABLE CompetitionCompetitors (
    [CompetitionID] INT
    , [CompetitorID] INT
    , [Score] INT

    , PRIMARY KEY (
        [CompetitionID]
        , [CompetitorID]
        )
    )

অন্যান্য প্রতিযোগিতাগুলিতে প্রতিযোগিতা কমপিটারের প্রতিযোগিতা। প্রতিযোগিতা আইডি এবং প্রতিযোগী আইডি নির্দেশ করে।

এই ধরণের টেবিল কাঠামোর সাথে - আপনার কীগুলি সমস্ত সাধারণ INTS - এমন কোনও প্রাকৃতিক কী বলে মনে হয় না যা মডেলটির সাথে খাপ খায় তাই আমি মনে করি একটি সারোগেট কী এখানে খুব ভাল fit

সুতরাং যদি আপনার কাছে এটি থাকে তবে নির্দিষ্ট প্রতিযোগিতায় প্রতিযোগীদের আলাদা তালিকা পেতে আপনি এই জাতীয় একটি কোয়েরি ইস্যু করতে পারেন:

DECLARE @CompetitionName VARCHAR(50) SET @CompetitionName = 'London Marathon'

    SELECT
        p.[CompetitorName] AS [CompetitorName]
    FROM
        Competitor AS p
    WHERE
        EXISTS (
            SELECT 1
            FROM
                CompetitionCompetitor AS cc
                JOIN Competition AS c ON c.[ID] = cc.[CompetitionID]
            WHERE
                cc.[CompetitorID] = p.[CompetitorID]
                AND cc.[CompetitionName] = @CompetitionNAme
        )

এবং যদি আপনি প্রতিটি প্রতিযোগিতার জন্য স্কোর চান তবে একজন প্রতিযোগী এখানে আছেন:

SELECT
    p.[CompetitorName]
    , c.[CompetitionName]
    , cc.[Score]
FROM
    Competitor AS p
    JOIN CompetitionCompetitor AS cc ON cc.[CompetitorID] = p.[CompetitorID]
    JOIN Competition AS c ON c.[ID] = cc.[CompetitionID]

এবং যখন আপনার নতুন প্রতিযোগীদের সাথে একটি নতুন প্রতিযোগিতা রয়েছে তখন আপনি কেবল প্রতিযোগীদের সারণীতে ইতিমধ্যে কোনটি বিদ্যমান তা পরীক্ষা করে দেখুন। যদি সেগুলি ইতিমধ্যে বিদ্যমান থাকে তবে আপনি সেই প্রতিযোগীদের জন্য প্রতিযোগীতে প্রবেশ করবেন না এবং নতুনদের জন্য সন্নিবেশ করবেন না।

তারপরে আপনি প্রতিযোগিতায় নতুন প্রতিযোগিতা সন্নিবেশ করান এবং পরিশেষে আপনি কেবল সমস্ত প্রতিযোগিতা সংযোগকারীগুলিতে লিঙ্ক তৈরি করেন।


2
ধরে নিই যে এই সময়ে ওপির একটি ক্যাশেড ফলাফল পাওয়ার জন্য তার সমস্ত টেবিলের পুনর্গঠন করার ভারসাম্য রয়েছে। আপনার ডিবি এবং অ্যাপ্লিকেশনটি পুনরায় লিখন, কিছু সংজ্ঞায়িত স্কোপের মধ্যে সমস্যাটি সমাধান করার পরিবর্তে, প্রতিবার কোনও কিছু সহজে জায়গায় না পড়লে এটি বিপর্যয়ের প্রতিকার।
জেফ্রি ভেস্ট

1
সম্ভবত আমার মতো ওপি-র ক্ষেত্রে, আপনার কাছে ডেটাবেস পরিবর্তন করার সবসময় অ্যাক্সেস থাকে না .. এবং পুরাতন ডাটাবেসটির পুনর্লিখন / সাধারনকরণ সবসময় বাজেটে বা বরাদ্দের সময়ে হয় না।
eaglei22

10

আপনি টেবিল একসঙ্গে যোগ দিতে এবং অনন্য প্রতিযোগীদের যে ইতিমধ্যেই উপস্থিত না থাকার একটি তালিকা পেতে প্রয়োজন হবে Competitors

এটি অনন্য রেকর্ড সন্নিবেশ করবে।

INSERT Competitors (cName) 
SELECT DISTINCT Name
FROM CompResults cr LEFT JOIN Competitors c ON cr.Name = c.cName
WHERE c.Name IS NULL

এমন একটি সময় আসতে পারে যখন অনন্য নাম নির্বাচনের জন্য অপেক্ষা না করে এই সন্নিবেশটি দ্রুত করা দরকার। সেক্ষেত্রে আপনি কোনও অস্থায়ী টেবিলের মধ্যে অনন্য নামগুলি সন্নিবেশ করতে পারেন এবং তারপরে আপনার আসল সারণিতে sertোকাতে সেই অস্থায়ী টেবিলটি ব্যবহার করতে পারেন। এটি ভালভাবে কাজ করে কারণ আপনি যখন কোনও অস্থায়ী সারণীতে .োকাচ্ছেন তখন সমস্ত প্রক্রিয়াজাতকরণ ঘটে তাই এটি আপনার আসল সারণিকে প্রভাবিত করে না। তারপরে আপনার সমস্ত প্রসেসিং শেষ হয়ে গেলে, আপনি আসল টেবিলটিতে একটি দ্রুত inোকান। আমি এমনকি লেনদেনের ভিতরে, যেখানে আপনি আসল টেবিলটি sertোকান সেখানে শেষ অংশটি মোড়ানো হতে পারে।


4

উপরের উত্তরগুলি যা স্বাভাবিক করার বিষয়ে আলোচনা দুর্দান্ত! তবে আপনি যদি নিজেকে আমার মতো অবস্থানে খুঁজে পান যেখানে আপনাকে ডাটাবেস স্কিমা বা কাঠামোটি দাঁড় করানোর অনুমতি নেই? উদাহরণস্বরূপ, ডিবিএ'রাই 'দেবতা' এবং সমস্ত প্রস্তাবিত সংশোধনগুলি / দেব / নালায় যায়?

এই সম্মানের সাথে, আমার মনে হয় যে এই স্ট্যাক ওভারফ্লো পোস্ট কোডের নমুনা দেওয়ার উপরোক্ত সমস্ত ব্যবহারকারীদের ক্ষেত্রেও পোস্টিং দিয়ে উত্তর দেওয়া হয়েছে

আমি থেকে কোড reposting করছি ঢোকান মূল্যবোধ কোথায় বিদ্যমান নয় যা আমাকে সবচেয়ে কোনো অন্তর্নিহিত ডাটাবেস সারণি যেহেতু আমি পরিবর্তন করতে পারবেন না সাহায্য সহায়তা দিয়েছে,

INSERT INTO #table1 (Id, guidd, TimeAdded, ExtraData)
SELECT Id, guidd, TimeAdded, ExtraData
FROM #table2
WHERE NOT EXISTS (Select Id, guidd From #table1 WHERE #table1.id = #table2.id)
-----------------------------------
MERGE #table1 as [Target]
USING  (select Id, guidd, TimeAdded, ExtraData from #table2) as [Source]
(id, guidd, TimeAdded, ExtraData)
    on [Target].id =[Source].id
WHEN NOT MATCHED THEN
    INSERT (id, guidd, TimeAdded, ExtraData)
    VALUES ([Source].id, [Source].guidd, [Source].TimeAdded, [Source].ExtraData);
------------------------------
INSERT INTO #table1 (id, guidd, TimeAdded, ExtraData)
SELECT id, guidd, TimeAdded, ExtraData from #table2
EXCEPT
SELECT id, guidd, TimeAdded, ExtraData from #table1
------------------------------
INSERT INTO #table1 (id, guidd, TimeAdded, ExtraData)
SELECT #table2.id, #table2.guidd, #table2.TimeAdded, #table2.ExtraData
FROM #table2
LEFT JOIN #table1 on #table1.id = #table2.id
WHERE #table1.id is null

উপরের কোডটি আপনার কাছে যা আছে তার থেকে আলাদা ক্ষেত্রগুলি ব্যবহার করে তবে আপনি বিভিন্ন কৌশল দিয়ে সাধারণ বক্তব্য পান।

নোট করুন যে স্ট্যাক ওভারফ্লোতে মূল উত্তর অনুসারে, এই কোডটি এখান থেকে অনুলিপি করা হয়েছিল

যাইহোক আমার বক্তব্যটি "সেরা অনুশীলন" হ'ল প্রায়শই আপনি যা করতে পারেন তেমন তত্ত্বের সাথে নেমে আসে।

  • আপনি যদি সূচি / কীগুলি স্বাভাবিক করতে এবং উত্পন্ন করতে সক্ষম হন - দুর্দান্ত!
  • যদি না হয় এবং আপনার মতো আমার মতো কোড হ্যাকের অবলম্বন রয়েছে, আশা করি উপরেরটি সাহায্য করে।

শুভকামনা!


যদি এটি পরিষ্কার না হয় তবে সমস্যাটির চারটি ভিন্ন পদ্ধতির এটি তাই বেছে নিন।
nasch

3

আপনার অপারেশনাল টেবিলগুলিকে সাধারণকরণলেনদেন চার্লি দ্বারা প্রস্তাবিত হিসাবে করা একটি ভাল ধারণা, এবং সময়ের সাথে সাথে অনেক মাথাব্যথা এবং সমস্যাগুলি বাঁচাতে পারে - তবে ইন্টারফেস টেবিলের মতো জিনিস রয়েছে যা বাহ্যিক ব্যবস্থার সাথে সংহতকরণকে সমর্থন করে, এবং রিপোর্টিং টেবিলগুলি যা বিশ্লেষণাত্মক মতো জিনিসগুলিকে সমর্থন করে প্রক্রিয়াকরণের; এবং এই ধরণের টেবিলগুলি অগত্যা স্বাভাবিক করা উচিত নয় - বাস্তবে, খুব প্রায়শই এটি অনেক বেশি, অনেক বেশি সুবিধাজনক এবং না পারার জন্য পারফরম্যান্ট is

এই ক্ষেত্রে, আমি মনে করি আপনার অপারেশনাল টেবিলগুলির জন্য লেনদেন চার্লির প্রস্তাব ভাল।

তবে আমি প্রতিযোগীকরণের টেবিলে প্রতিযোগীকরণের তালিকায় একটি সূচক (অগত্যা অনন্য নয়) যুক্ত করব (সংখ্যার বাহ্যিক উত্স থেকে ডেটা লোড করা) এর উদ্দেশ্যে দক্ষ প্রতিযোগী নামটি সমর্থন করার জন্য এবং আমি মিশ্রণের মধ্যে একটি ইন্টারফেস টেবিল রাখব: প্রতিযোগিতা ফলাফল।

প্রতিযোগিতার ফলাফলগুলিতে আপনার প্রতিযোগিতার ফলাফলগুলিতে এতে থাকা ডেটা থাকা উচিত। এটির মতো একটি ইন্টারফেস টেবিলের বিন্দু হ'ল এটি একটি এক্সেল শীট বা একটি সিএসভি ফাইল, বা আপনার যে তথ্য ফর্মটিতে থাকা যাই হোক না কেন ফর্ম থেকে এটি কেটে ফেলা এবং পুনরায় লোড করা যতটা সম্ভব দ্রুত এবং সহজ করা easy

এই ইন্টারফেস টেবিলটি অপারেশনাল টেবিলগুলির সাধারণীকৃত সেটগুলির অংশ হিসাবে বিবেচনা করা উচিত নয়। এরপরে আপনি রিচার্ডের পরামর্শ অনুসারে প্রতিযোগিতার ফলাফলের সাথে যোগ দিতে পারেন, ইতিমধ্যে বিদ্যমান নেই এমন প্রতিযোগীদের মধ্যে রেকর্ড ,োকাতে এবং যাগুলি করেন তা আপডেট করুন (উদাহরণস্বরূপ যদি আপনার কাছে প্রতিযোগীদের সম্পর্কে আরও তথ্য থাকে যেমন তাদের ফোন নম্বর বা ইমেল ঠিকানা)।

একটি জিনিস আমি লক্ষ্য করব - বাস্তবে, প্রতিযোগী নাম, এটি আমার কাছে মনে হয়, তা আপনার ডেটাতে অনন্য হওয়ার সম্ভাবনা খুব কম । 200,000 প্রতিযোগী হিসাবে, আপনার কাছে খুব ভাল 2 বা আরও বেশি ডেভিড স্মিথ থাকতে পারে, উদাহরণস্বরূপ। সুতরাং আমি আপনাকে সুপারিশ করব যে আপনি প্রতিযোগীদের কাছ থেকে আরও তথ্য সংগ্রহ করুন, যেমন তাদের ফোন নম্বর বা ইমেল ঠিকানা বা অনন্য হওয়ার সম্ভাবনা বেশি এমন কিছু।

আপনার অপারেশনাল টেবিল, প্রতিযোগীরা, প্রতিটি সংযুক্ত প্রাকৃতিক কীতে অবদান রাখে এমন প্রতিটি ডেটা আইটেমের জন্য কেবল একটি কলাম থাকতে হবে; উদাহরণস্বরূপ এটিতে প্রাথমিক ইমেল ঠিকানার জন্য একটি কলাম থাকা উচিত। তবে ইন্টারফেস টেবিলটিতে পুরানো জন্য স্লট থাকা উচিত এবং নতুনের একটি প্রাথমিক ইমেল ঠিকানার মানের জন্য , যাতে পুরানো মান প্রতিযোগীদের রেকর্ড সন্ধান করতে এবং এর অংশটি নতুন মানে আপডেট করতে পারে।

সুতরাং প্রতিযোগিতার ফলাফলগুলিতে কিছু "পুরাতন" এবং "নতুন" ক্ষেত্র থাকা উচিত - ওল্ডমেইল, নতুন ইমেল, ওল্ডফোন, নিউফোন ইত্যাদি That এইভাবে আপনি প্রতিযোগীকারীগুলিতে, প্রতিযোগী নাম, ইমেল এবং ফোন থেকে একটি সম্মিলিত কী গঠন করতে পারেন।

তারপরে যখন আপনার কিছু প্রতিযোগিতার ফলাফল রয়েছে, আপনি আপনার এক্সেল শীট বা আপনার যা কিছু আছে তা থেকে আপনার প্রতিযোগিতা ফলাফল টেবিলটি ছাঁটাই এবং পুনরায় লোড করতে পারেন এবং প্রতিযোগী সারণীতে সমস্ত নতুন প্রতিযোগী সন্নিবেশ করার জন্য একটি একক, দক্ষ সন্নিবেশ চালনা করতে পারেন এবং আপডেট করার জন্য একক, দক্ষ আপডেট প্রতিযোগিতা ফলাফল থেকে বিদ্যমান প্রতিযোগীদের সম্পর্কে সমস্ত তথ্য। এবং আপনি প্রতিযোগীতা প্রতিযোগী টেবিলের মধ্যে নতুন সারি সন্নিবেশ করতে একটি একক সন্নিবেশ করতে পারেন। এই জিনিসগুলি একটি প্রক্রিয়া প্রতিযোগিতা ফলাফল সংরক্ষণের পদ্ধতিতে করা যেতে পারে, যা প্রতিযোগিতা ফলাফল সারণী লোড করার পরে কার্যকর করা যেতে পারে।

ওরাকল অ্যাপ্লিকেশন, এসএপি, পিপলসফট এবং অন্যান্য এন্টারপ্রাইজ সফ্টওয়্যার স্যুটগুলির একটি লন্ড্রি তালিকার সাথে আমি সত্যিকারের বিশ্বে কী ঘটেছে এবং এর বেশিরভাগ ক্ষেত্রে যা দেখেছি তার এক ধরণের প্রাথমিক বর্ণনা এটি।

একটা শেষ মন্তব্য আমি চাই আমি তাই আগে তৈরি করেছেন হল: আপনি একটি বিদেশী কী তৈরি যে নিশ্চিত করে যে প্রতিযোগী প্রতিযোগীরা টেবিল বিদ্যমান আগে আপনি CompetitionCompetitors তা যে প্রতিযোগী সঙ্গে একটি সারিতে যোগ করতে পারেন, নিশ্চিত করুন যে করা বিদেশী কী ক্যাসকেড আপডেট এবং মুছতে সেট করা আছে । এইভাবে যদি আপনার কোনও প্রতিযোগীকে মুছতে হয় তবে আপনি এটি করতে পারেন এবং সেই প্রতিযোগীর সাথে সম্পর্কিত সমস্ত সারি স্বয়ংক্রিয়ভাবে মোছা হবে। অন্যথায়, ডিফল্টরূপে, বিদেশী কীটির জন্য আপনাকে প্রতিযোগিতা মুদ্রণকারীদের বাইরে সম্পর্কিত সমস্ত সারি মুছে ফেলতে হবে এটি আপনাকে প্রতিযোগী মুছতে দেবে before

(কিছু লোক মনে করে যে নন-ক্যাসকেডিং বিদেশী কীগুলি একটি ভাল সুরক্ষার সতর্কতা, তবে আমার অভিজ্ঞতা হ'ল এগুলি কেবল বাটটিতে একটি বিরক্তিকর ব্যথা যা প্রায়শই কোনও তদারকির ফলস্বরূপ হয় না এবং তারা কাজ করার একগুচ্ছ তৈরি করে more ডিবিএ'র জন্য। লোকজনকে দুর্ঘটনাক্রমে জিনিসগুলি মোছার সাথে ডিল করা হ'ল আপনার কাছে "আপনি কি নিশ্চিত" ডায়লগ এবং বিভিন্ন ধরণের নিয়মিত ব্যাকআপ এবং অপ্রয়োজনীয় ডেটা উত্স রয়েছে far এটি এখন পর্যন্ত অনেক বেশি সাধারণ যে কোনও প্রতিযোগীকে মুছে ফেলতে চান, যার তথ্য সমস্তই উদাহরণস্বরূপ গণ্ডগোল হয়েছে, দুর্ঘটনাক্রমে একটি মুছুন এবং তারপরে যান "ওহ না! আমি তা করার মানেই করি নি! এবং এখন আমার প্রতিযোগিতার ফলাফল নেই! আআআহহহ!" পরবর্তীটি অবশ্যই যথেষ্ট সাধারণ, তাই তাই , আপনার এটির জন্য প্রস্তুত হওয়া দরকার, তবে পূর্ববর্তীটি অনেক বেশি সাধারণ,সুতরাং প্রাক্তন, ইমো এর জন্য প্রস্তুত করার সবচেয়ে সহজ ও সর্বোত্তম উপায় হ'ল বিদেশী কীগুলি ক্যাসকেড আপডেট এবং মুছে ফেলা)


1

ঠিক আছে, এটি 7 বছর আগে জিজ্ঞাসা করা হয়েছিল, তবে আমি মনে করি যে এখানে সেরা সমাধানটি নতুন টেবিলটিকে পুরোপুরি পূর্বাভাস দেওয়া এবং এটি কেবল একটি কাস্টম ভিউ হিসাবে করুন। এইভাবে আপনি ডেটা সদৃশ করছেন না, স্বতন্ত্র ডেটা নিয়ে কোনও উদ্বেগ নেই এবং এটি প্রকৃত ডাটাবেস কাঠামোকে স্পর্শ করে না। এটার মতো কিছু:

CREATE VIEW vw_competitions
  AS
  SELECT
   Id int
   CompetitionName nvarchar(75)
   CompetitionType nvarchar(50)
   OtherField1 int
   OtherField2 nvarchar(64)  --add the fields you want viewed from the Competition table
  FROM Competitions
GO

অন্যান্য টেবিলগুলিতে এখানে যুক্ত করা যেতে পারে যেমন অন্যান্য টেবিলগুলিতে যোগ হয়, যেখানে শৃঙ্খলা ইত্যাদি, এটি সম্ভবত এই সমস্যার সর্বাধিক মার্জিত সমাধান, আপনি এখন কেবলমাত্র মতামতটি জিজ্ঞাসা করতে পারেন:

SELECT *
FROM vw_competitions

... এবং ভিউ কোয়েরিতে যে কোনও WHERE, IN, বা বিদ্যমান ক্লজ যুক্ত করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.