ما هو الصحيح/ أسرع طريقة تحديث/إدراج سجل في sql (فايربيرد/MySql)

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

  •  19-08-2019
  •  | 
  •  

سؤال

انا بحاجة الى بعض SQL لتحديث سجل في قاعدة البيانات إذا كان موجودا وأدخله عندما لا تبحث حولها ، يبدو أن هناك عدة حلول لهذا, ولكن أنا لا أعرف ما هي الصحيح/ قبول طرق للقيام بذلك.

أود مثالي للعمل على كلا فايربيرد 2 و MySQL 5 التحديث سوف تحتاج إلى أن تكون ركض ضد كل قواعد البيانات و سيكون أسهل إذا كان نفس SQL ركض على حد سواء ، إذا عملت على أكثر من قاعدة بيانات من شأنها أن يكون زائدا.

سرعة وموثوقية أيضا عامل في والاعتمادية على السرعة في هذه الحالة ولكن سيكون من المحتمل أن تستخدم التحديث 1000 من السجلات في تتابع سريع (أكثر من جداول مختلفة).

أي subjections?

هل كانت مفيدة؟

المحلول

ويجب عليك إما استخدام شيء من هذا القبيل:

BEGIN TRANSACTION
IF EXISTS (SELECT * FROM the_table WHERE pk = 'whatever')
    UPDATE the_table SET data = 'stuff' WHERE pk = 'whatever'
ELSE
    INSERT INTO the_table (pk, data) VALUES ('whatever', 'stuff')
COMMIT

وأو هذا، ولكن إرساله كل منها على حدة، وتجاهل أي أخطاء من INSERT حول انتهاك القيود المفتاح الأساسي:

INSERT INTO the_table (pk, data) VALUES ('whatever', 'stuff')

UPDATE the_table SET data = 'stuff' WHERE pk = 'whatever'

نصائح أخرى

في فايربيرد 2.1 يمكنك استخدام UPDATE أو إدراج في الحالات البسيطة أو يدمج للحصول على سيناريوهات أكثر تعقيدا.

لالخلية، حاول الأمر REPLACE: HTTP: // ديف .mysql.com / وثيقة / RefMan معلومات / 5.0 / EN / replace.html

و(يرجى الاطلاع على تعليق على هذه الإجابة من طرف ميلان Babuskov لحكمه على فايربيرد).

في فايربيرد قبل 2.1 يمكنك استخدام هذه الطريقة صعبة:

insert into table (id, a, b, c) values (:id, :a, :b, :c)
when SQLCODE -803 
do
begin
  update table set a = :a, b = :b, c = :c where id = :id;
end;

محل يعمل تماما مثل إدراج ، إلا أنه إذا كان قديم صف في الجدول له نفس القيمة صف جديد مفتاح أساسي أو فهرس فريد, الصف القديم حذف قبل أن يتم إدراج صف جديد.

بناء الجملة :

محل [LOW_PRIORITY | تأخر] [إلى] tbl_name [(col_name,...)]

{ VALUES | VALUE} 

({expr | DEFAULT},...),(...),...

في حين أن : فمن الأفضل لتجنب استبدال عند العمل مع القيود.

ولقد استعملت INSERT في الخلية لتحديث الصفوف مع:
INSERT INTO table () VALUES () ON DUPLICATE KEY UPDATE key
ولكن لا يمكنك استخدام مفتاح السيارات التي تم إنشاؤها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top