تعطيل ADBLOCK

يمنع ADBlock بعض المحتوى على الموقع

ADBlock errore
العثور على نتائج: 

مبادلة قيم العمود المفهرسة فريدة من نوعها في قاعدة بيانات

StackOverflow https://stackoverflow.com/questions/644

سؤال

ولدي جدول قاعدة بيانات واحدة من المجالات (وليس المفتاح الأساسي) هو وجود فهرس فريد على ذلك. الآن أريد أن مبادلة القيم تحت هذا العمود للصفين. كيف يمكن انجاز هذا؟ اثنين الخارقة وأنا أعلم هي:

<رأ>
  • وحذف كل من الصفوف وإعادة إدراج لهم.
  • وتحديث الصفوف مع بعض قيمة أخرى وتبادل ومن ثم تحديث إلى القيمة الفعلية.

    ولكن لا أريد أن أذهب لهذه لأنها لا يبدو أن الحل المناسب لهذه المشكلة. يمكن لأي شخص مساعدتي؟

  • المحلول

    وأعتقد أن عليك أن تذهب لحل 2. ليس هناك وظيفة "مبادلة" في أي SQL البديل أعرف.

    إذا كنت تحتاج إلى القيام بذلك بانتظام، أقترح حلا 1، اعتمادا على كيفية استخدام أجزاء أخرى من البرنامج هذه البيانات. هل يمكن أن يكون تأمينها المشكلات إذا كنت غير دقيق.

    ولكن باختصار: لا يوجد حل آخر غير تلك التي ينص

    إذا أردت ، اترك لنا رأيك

    هل كانت المقالة مفيدة وهل تمت ترجمتها بشكل صحيح؟

    نصائح أخرى

    وكلمة سحرية على DEFERRABLE هنا:

    DROP TABLE ztable CASCADE;
    CREATE TABLE ztable
        ( id integer NOT NULL PRIMARY KEY
        , payload varchar
        );
    INSERT INTO ztable(id,payload) VALUES (1,'one' ), (2,'two' ), (3,'three' );
    SELECT * FROM ztable;
    
    
        -- This works, because there is no constraint
    UPDATE ztable t1
    SET payload=t2.payload
    FROM ztable t2
    WHERE t1.id IN (2,3)
    AND t2.id IN (2,3)
    AND t1.id <> t2.id
        ;
    SELECT * FROM ztable;
    
    ALTER TABLE ztable ADD CONSTRAINT OMG_WTF UNIQUE (payload)
        DEFERRABLE INITIALLY DEFERRED
        ;
    
        -- This should also work, because the constraint 
        -- is deferred until "commit time"
    UPDATE ztable t1
    SET payload=t2.payload
    FROM ztable t2
    WHERE t1.id IN (2,3)
    AND t2.id IN (2,3)
    AND t1.id <> t2.id
        ;
    SELECT * FROM ztable;
    

    والنتيجة:

    DROP TABLE
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "ztable_pkey" for table "ztable"
    CREATE TABLE
    INSERT 0 3
     id | payload
    ----+---------
      1 | one
      2 | two
      3 | three
    (3 rows)
    
    UPDATE 2
     id | payload
    ----+---------
      1 | one
      2 | three
      3 | two
    (3 rows)
    
    NOTICE:  ALTER TABLE / ADD UNIQUE will create implicit index "omg_wtf" for table "ztable"
    ALTER TABLE
    UPDATE 2
     id | payload
    ----+---------
      1 | one
      2 | two
      3 | three
    (3 rows)
    

    وعلاوة على الرد اندي ايرفينغ

    وهذا العمل بالنسبة لي (على SQL Server 2005) في وضع مماثل حيث لدي مفتاح مركب وأنا بحاجة لمبادلة حقل الذي هو جزء من قيد فريد.

    ومفتاح: PID، LNUM REC1: 10، 0 rec2: 10، 1 rec3: 10، 2 ​​

    وأنا بحاجة لمبادلة LNUM بحيث تكون النتيجة

    ومفتاح: PID، LNUM REC1: 10، 1 rec2: 10، 2 rec3: 10، 0

    وعلى SQL المطلوبة:

    UPDATE    DOCDATA    
    SET       LNUM = CASE LNUM
                  WHEN 0 THEN 1
                  WHEN 1 THEN 2 
                  WHEN 2 THEN 0 
              END
    WHERE     (pID = 10) 
      AND     (LNUM IN (0, 1, 2))
    

    وهناك نهج آخر يعمل مع SQL Server: استخدام جدول مؤقت الانضمام إليها في بيان UPDATE الخاص بك

    .

    وسبب المشكلة من خلال وجود صفين مع نفس القيمة <م> في نفس الوقت ، ولكن إذا قمت بتحديث كل الصفوف في وقت واحد (إلى قيمها الجديدة، فريدة من نوعها)، لا يوجد أي انتهاك القيد.

    والزائفة رمز:

    -- setup initial data values:
    insert into data_table(id, name) values(1, 'A')
    insert into data_table(id, name) values(2, 'B')
    
    -- create temp table that matches live table
    select top 0 * into #tmp_data_table from data_table
    
    -- insert records to be swapped
    insert into #tmp_data_table(id, name) values(1, 'B')
    insert into #tmp_data_table(id, name) values(2, 'A')
    
    -- update both rows at once! No index violations!
    update data_table set name = #tmp_data_table.name
    from data_table join #tmp_data_table on (data_table.id = #tmp_data_table.id)
    

    وبفضل ريتش H لهذه التقنية. - مارك

    وأعتقد أيضا أن رقم 2 هو أفضل رهان، على الرغم من أنني سوف أكون على يقين من التفاف عليه في الصفقة في حال حدوث خلل ما في منتصف التحديث.

    وبديل (منذ طلبتم) لتحديث القيم مؤشر فريد من نوعه مع قيم مختلفة سيكون لتحديث كافة القيم الأخرى في الصفوف إلى أن من صف آخر. القيام بذلك يعني أن كنت قد ترك القيم مؤشر فريد وحده، وفي النهاية، ينتهي بك الأمر مع البيانات التي تريدها. كن حذرا مع ذلك، في حالة بعض مراجع الجدول أخرى هذا الجدول في علاقة المفاتيح الخارجية، أن جميع العلاقات في DB لا تزال سليمة.

    ولدي نفس المشكلة. وهنا النهج المقترح الخاص بي في كيو. في حالتي، مؤشر بلدي فريدة من نوعها هو قيمة تسلسل، وتحديد مستخدم النظام صريح في صفوف بلدي. المستخدم سوف خلط ورق اللعب صفوف حولها في التطبيق على شبكة الإنترنت، ثم تقديم التغييرات.

    وأنا أخطط لإضافة "قبل" الزناد. وفي هذا الزناد، كلما تم تحديث بلدي قيمة المؤشر فريدة من نوعها، وسوف ننظر لنرى ما اذا كان أي صف آخر يحمل سبق لي قيمة جديدة. إذا كان الأمر كذلك، سوف أعطي لهم بلدي القيمة القديمة، وسرقة بشكل فعال قيمة قبالة لهم.

    وأنا على أمل أن كيو تسمح لي أن أفعل ذلك خلط في قبل الزناد.

    وأنا ما بعد الظهر وتتيح لك معرفة بلدي الأميال.

    وعلى افتراض انك تعرف PK اثنين من الصفوف التي تريد تحديث ... وهذا يعمل في SQL Server، لا يمكن التحدث عن غيرها من المنتجات. SQL هو (يفترض أن يكون) الذري على المستوى البيان:

    CREATE TABLE testing
    (
        cola int NOT NULL,
        colb CHAR(1) NOT NULL
    );
    
    CREATE UNIQUE INDEX UIX_testing_a ON testing(colb);
    
    INSERT INTO testing VALUES (1, 'b');
    INSERT INTO testing VALUES (2, 'a');
    
    SELECT * FROM testing;
    
    UPDATE testing
    SET colb = CASE cola WHEN 1 THEN 'a'
                    WHEN 2 THEN 'b'
                    END
    WHERE cola IN (1,2);
    
    SELECT * FROM testing;
    

    وهكذا سوف تذهب من:

    cola    colb
    ------------
    1       b
    2       a
    

    إلى:

    cola    colb
    ------------
    1       a
    2       b
    

    لأوراكل هناك خيار، مؤجلة، ولكن لديك لإضافته إلى القيد الخاص بك.

    SET CONSTRAINT emp_no_fk_par DEFERRED; 
    

    لتأجيل ALL القيود التي deferrable خلال الدورة بأكملها، يمكنك استخدام القيود ALTER الدورة SET = عبارة مؤجلة.

    المصدر

    وأوراكل أرجأت فحص سلامة الذي يحل هذا بالضبط، ولكن لم يكن متوفرا في أي SQL Server أو الخلية.

    في SQL Server، يمكن بيان MERGE تحديث الصفوف التي من شأنها كسر عادة مفتاح فريد / INDEX. (فقط اختبار هذا لأنني كنت غريبة).

    ولكن، عليك أن تستخدم جدول مؤقت / متغير لتزويد MERGE ث / الصفوف اللازمة.

    وأنا عادة التفكير في قيمة على الإطلاق أي مؤشر في مائدتي يمكن أن يكون. عادة - للقيم عمود فريدة من نوعها - فإنه من السهل حقا. على سبيل المثال، لقيم العمود موقف '(معلومات عن هذا الامر من عدة عناصر) انها 0.

    وبعد ذلك يمكنك نسخ قيمة A متغير، تحديثه مع قيمة B ثم قم بتعيين قيمة B من متغير الخاص بك. اثنين من الاستفسارات، وأنا أعلم لا يوجد حل أفضل بالرغم من ذلك.

    1) تبديل هويات لاسم

    id    student 
    
    1     Abbot   
    2     Doris  
    3     Emerson 
    4     Green  
    5     Jeames  
    

    لإدخال عينة، والناتج هو:

    وطالب معرف

    1     Doris   
    2     Abbot   
    3     Green   
    4     Emerson 
    5     Jeames  
    

    و"في القضية رقم ن الصفوف كيف ستدير ......"

    Licensed under: CC-BY-SA with attribution
    Not affiliated with StackOverflow