MySQL වගුවකට ඇතුළු කරන්න හෝ තිබේ නම් යාවත්කාලීන කරන්න


906

දත්ත සමුදා වගුවකට පේළියක් එක් කිරීමට මට අවශ්‍යය, නමුත් එකම අද්විතීය යතුරක් සහිත පේළියක් තිබේ නම් මට පේළිය යාවත්කාලීන කිරීමට අවශ්‍යය.

උදාහරණයක් වශයෙන්:

INSERT INTO table_name (ID, NAME, AGE) VALUES(1, "A", 19);

අද්විතීය යතුර යැයි කියමු ID, මගේ දත්ත ගබඩාවේ පේළියක් ඇත ID = 1. එවැනි අවස්ථාවකදී, මෙම අගයන් සමඟ එම පේළිය යාවත්කාලීන කිරීමට මට අවශ්‍යය. සාමාන්යයෙන් මෙය දෝෂයක් ලබා දෙයි.
මා භාවිතා කරන්නේ නම් INSERT IGNOREඑය දෝෂය නොසලකා හරිනු ඇත, නමුත් එය තවමත් යාවත්කාලීන නොවේ.


7
සින්ටැක්ස් හි අගයන් අනුපිටපත් කිරීමට බල නොකරන සහ ප්‍රාථමික යතුර ආරක්ෂා කරන මෙම භාවිත අවස්ථාව සඳහා SQL හට නිල වාක්‍ය ඛණ්ඩයක් අවශ්‍ය වේ.
පීට් ඇල්වින්

බලපෑමට ලක්වූ හැඳුනුම්පත ලබා ගැනීම සඳහා MySQL ON DUPLICATE KEY
ක්‍රිස් රූෆ්

Caveat: 5.7 අනුවාදය අනුව, මෙම ප්‍රවේශය INSERT / UPDATE මෙහෙයුමේ කොටසක් ලෙස WHERE වගන්තියට directly ජුව සහාය නොදක්වයි. එසේම, යාවත්කාලීන කිරීමක් ඇත්ත වශයෙන්ම වෙනම මෙහෙයුම් දෙකක් ලෙස සලකනු ලැබේ (DELETE සහ INSERT) ... විගණන අරමුණු සඳහා එය වැදගත් වේ. (Learnbit)
dreftymac

Answers:


1657

භාවිත INSERT ... ON DUPLICATE KEY UPDATE

ප්‍රශ්නය:

INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE    
name="A", age=19

91
+1 මා සොයාගත් දෙයින්, මෙම ක්‍රමය ස්වයංක්‍රීයව වර්ධක යතුරු සහ වෙනත් අද්විතීය යතුරු isions ට්ටන සඳහා ප්‍රතිස්ථාපනය කිරීමට වඩා අඩු ගැටළු සහගත වන අතර එය වඩාත් කාර්යක්ෂම වේ.
ඇන්ඩ rew එන්ස්ලි

50
ඔබ සැවොම මේ ගැන සඳහන් කරන බව මම දනිමි, නමුත් මට අවශ්‍ය වන්නේ අන් අය වෙනුවෙන් පැහැදිළි වීමයි. ඔබ ඇතුළු කරන හැඳුනුම්පත ප්‍රාථමික කේ හෝ යුනික් නොවේ නම්, මෙය ක්‍රියා නොකරනු ඇත. මගේ හැඳුනුම්පත අද්විතීය නොවන නිසා මෙය මුලින් මට වැඩ කළේ නැත.
කෙවන්

7
තනි පේළියක් සාර්ථකව යාවත්කාලීන කිරීමේදී ප්‍රති affected row countresults ල ලැබෙන්නේ මන්දැයි මම කල්පනා කරමි. 2වෙන කාටහරි මේ ප්‍රති result ලය ලැබුණාද? (දත්ත නිවැරදිව යාවත්කාලීන කර ඇත: තේරුම යාවත්කාලීන කර ඇත්තේ පේළි 1 ක් පමණි)
ඩිමිට්‍රි කේ

16
මෙය ටිකක් ප්‍රමාදයි, කෙසේ වෙතත්: බලපෑමට ලක් වූ පේළි 2 කින් වැඩි කිරීම යාවත්කාලීන කරන බව අත්පොතෙහි සඳහන් වේ. ON DUPLICATE KEY UPDATEකිසිවක් සත්‍ය වශයෙන්ම යාවත්කාලීන නොවන්නේ නම් එය 0 වාර්තා කරයි (සාමාන්‍ය පරිදි UPDATE).
Vatev

64
ඔබ ඇතුළු කිරීමට උත්සාහ කරන අගය සඳහන් කිරීම සඳහා ඔබට වටිනාකම් (නම) භාවිතා කළ හැකි බව සලකන්න. උදා: වගුවට ඇතුල් කරන්න (හැඳුනුම්පත, නම, වයස) වටිනාකම් (1, "ඒ", 19) , age = VALUES (වයස)
කුතුහලය දනවන සෑම්

251

REPLACE බලන්න

http://dev.mysql.com/doc/refman/5.0/en/replace.html

REPLACE into table (id, name, age) values(1, "A", 19)

11
Ion පියොන්ටෙක් මෙය කෙටි හා තේරුම් ගැනීමට පහසු නිසා සහ "අනුපිටපත් ඇතුළත් කිරීම" වඩා හොඳ වන්නේ මන්දැයි කිසිවෙකු පැහැදිලි නොකළ බැවිනි.
Mr_Chimp

77
එය වාර්තාවේ හැඳුනුම්පත් වෙනස් කරන අතර එමඟින් විදේශීය යොමු කිරීම් විනාශ විය හැකිය.
බොහ්

107
REPLACE INTO හි ඇති අනෙක් ගැටළුව නම්, ඔබ සියලු ක්ෂේත්‍ර සඳහා අගයන් නියම කළ යුතුය ... එසේ නොමැතිනම් ක්ෂේත්‍ර නැති වී හෝ පෙරනිමි අගයන් සමඟ ප්‍රතිස්ථාපනය වේ. ඇතුල් ආදේශ කරන්න අවශ්යයෙන්ම දමයි එය පවතියි නම් එය පේළිය, හා නව පේළිය ඇතුල්. උදාහරණයක් ලෙස, ඔබ වගුව (හැඳුනුම්පත, වයස) අගයන් (1, 19) ප්‍රතිස්ථාපනය කළේ නම් නාම ක්ෂේත්‍රය අහෝසි වේ.
ඩේල්

35
මෙය සැබවින්ම මුළු පේළිය මකා දමා නව INSERT සිදු කරයි.
mjb

8
jmjb එබැවින් ඔබට DELETE වරප්‍රසාද තිබිය යුතුය, ඔබට ඒවා අවශ්‍ය නොවන්නේ නම් එය වඩාත් සුදුසුය. මගේ පරිසරයේ දත්ත සමුදා පරිශීලකයා සතුව ඇත්තේ INSERT සහ UPDATE අවසර පමණි, එබැවින් ප්‍රතිස්ථාපනය ක්‍රියා නොකරනු ඇත.
ndm13

55

කණ්ඩායම් ඇතුළත් කිරීම භාවිතා කරන විට පහත සඳහන් වාක්‍ය ඛණ්ඩය භාවිතා කරන්න:

INSERT INTO TABLE (id, name, age) VALUES (1, "A", 19), (2, "B", 17), (3, "C", 22)
ON DUPLICATE KEY UPDATE
    name = VALUES (name),
    ...

වැඩ නොකරන්නේ නම් VALUES(name), ඔබට උත්සාහ කළ හැකියname = 'name_value',...;
පුත් ෆාම්

26

මෙය අත්හදා බලන්න:

INSERT INTO table (id, name, age) VALUES (1, 'A', 19) ON DUPLICATE KEY UPDATE id = id + 1;

මෙය උපකාරී වේ යැයි සිතමි.


6
ඇත්ත වශයෙන්ම මට නව අගයක් වෙනත් පේළියකට නව හැඳුනුම්පතක් සමඟ එක් කිරීමට අවශ්‍ය නැත, ඒ වෙනුවට දැනට පවතින id = 1 හි අගයන් මෙම අගයන් සමඟ ප්‍රතිස්ථාපනය කිරීමට මට අවශ්‍යය. (මට තේරෙන පරිදි මෙය හැඳුනුම්පත වැඩි කර දත්ත එක් කරයි)
කේෂාන්

51
අනුපිටපත් මත හැඳුනුම්පත එකින් එක වැඩි කිරීමට ඔහුට අවශ්‍ය යැයි මම නොසිතමි.
ඩොනී

7
"සීමාව" යනු ඔබ සොයන වචනය නොවේ :) අවාසනාවකට මෙන්, දැන් මම "වරද" දැක ඇත්තෙමි, මට තවදුරටත් සත්‍ය වචනය දෘශ්‍යමාන කළ නොහැක ..
mwfearnley

1
ඔබ "ගමන්" හෝ "ආවරණ" සොයමින් සිටියාද?
ක්‍රිස් දේව්

4
@mwfearnley ඔබ දෘශ්‍ය කිරීමට උත්සාහ කළ වචනය “ඉක්මවා” යන්නයි. ගත වූයේ වසර එකහමාරක් පමණි :-)
මයිකල් ක්‍රෙබ්ස්

21

මේක උත්සාහ කරන්න:

INSERT INTO table (id,name,age) VALUES('1','Mohammad','21') ON DUPLICATE KEY UPDATE name='Mohammad',age='21'

සටහන:
මෙහි හැඳුනුම්පත මූලික යතුර නම්, පළමු වරට ඇතුළත් කිරීමෙන් පසු ඇතුළු id='1'කිරීමට උත්සාහ කරන id='1'විට නම සහ වයස යාවත්කාලීන වන අතර පෙර නම වයස වෙනස් වේ.


මට හැඳුනුම්පත භාවිතා නොකර වැඩ කිරීමට අවශ්‍යයි . ප්‍රාථමික යතුරකින් තොරව ඔබ උත්සාහ කර තිබේද?
ersks

@ersks ප්‍රශ්නය දකී. අද්විතීය යතුරක් ඇති විට පරිශීලකයා විමසීය
Rasel

මට එය ලැබුණි, නමුත් මම උත්සාහ කරන්නේ මෙම සාරධර්ම පමණක් දන්නා මගේ ගැටලුව විසඳීමට ය. එබැවින්, එවැනි තත්වයක් තුළ නිවැරදි විසඳුමක් බලාපොරොත්තුවෙන් මම ඉහත අදහස් දැක්වුවෙමි.
ersks

17
INSERT IGNORE INTO table (id, name, age) VALUES (1, "A", 19);

INSERT INTO TABLE (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE NAME = "A", AGE = 19;

REPLACE INTO table (id, name, age) VALUES(1, "A", 19);

මෙම සියලු විසඳුම් ඔබගේ ප්‍රශ්නය සම්බන්ධයෙන් ක්‍රියා කරනු ඇත.

ඔබට මෙම ප්‍රකාශය පිළිබඳ විස්තර දැන ගැනීමට අවශ්‍ය නම් මෙම සබැඳියට පිවිසෙන්න


REPLACEසම්බන්ධිත ලේඛනයේ ලේඛනගත කර නොමැත.
රේ බැක්ස්ටර්

අක්ෂර වින්‍යාසය පිරී ඇති sql විමසීම්, ඔබේ උදාහරණ ක්‍රියා නොකරනු ඇත. එය වගුවට ඇතුල් කරන්න (වගුවට ඇතුල් නොවේ) සහ ඩුප්ලිකේට් යතුරු යාවත්කාලීන කිරීම (අනුපිටපත් යාවත්කාලීන කට්ටලය මත නොවේ). මෙය ඉහළට ඔසවා තබන්නේ කවුරුන්දැයි විශ්වාස නැත
රොබට් සින්ක්ලෙයාර්

1
යතුරු ලියනය කිරීමේ දෝෂය ගැන කණගාටුයි. මාව නිවැරදි කිරීම ගැන ස්තූතියි
දිල්රාජ් සිං

13

SQLite භාවිතා කරන විට:

REPLACE into table (id, name, age) values(1, "A", 19)

බව ලබා idප්රාථමික යතුර වේ. නැතහොත් එය වෙනත් පේළියක් ඇතුල් කරයි. INSERT (SQLite) බලන්න .


කුමක්ද replace intoකරන්නේ හරියටම "පවතින විට තුලට ඇතුල්, හෝ යාවත්කාලීන" වේ. W ඕවල්
ඩෝන්සොං

+1 (1 න් 3) මගේ තත්වය සඳහා මෙය ක්‍රියාත්මක වන බව මට පෙනී ගියේය - පවතින පේළියක් අද්විතීය යතුරකින් ආදේශ කිරීමට මට අවශ්‍ය විය, නැතිනම් පේළිය එක් කරන්න. මෙහි සරලම විසඳුම්.
therobyouknow

(2 න් 3) මගේ විමසුම:CREATE TRIGGER worklog_update AFTER INSERT ON worklog FOR EACH ROW REPLACE INTO support_time_monthly_hours ( ProjectID, monthTotalTime, Year, Month ) SELECT jiraissue.PROJECT, SUM(worklog.timeworked), YEAR(CURRENT_DATE()), MONTH(CURRENT_DATE()) FROM worklog, jiraissue WHERE worklog.issueid = jiraissue.ID AND jiraissue.PROJECT = (SELECT PROJECT FROM jiraissue WHERE NEW.issueid = jiraissue.ID ) AND worklog.startdate BETWEEN DATE_FORMAT(NOW() ,'%Y-%m-01 00:00:00') AND NOW();
therobyouknow

(3 න් 3) අදාළ ප්‍රශ්න / පිළිතුරු stackoverflow.com/questions/41767517/…
therobyouknow

2
MySQL හි ඇති ගැටළුව නම් ප්‍රතිස්ථාපනය වෙනත් අගයන් ලබා නොදුනහොත් ඒවා ඉවත් කිරීමයි. කෙසේ වෙතත් @ ෆැබියානෝ-සූසා විසඳුම වඩාත් යෝග්‍ය වේ
ක්වාම්බර් අලි

12

මා මෙහි පැමිණියේ මෙම විසඳුම සොයමින් සිටි නමුත් සමාන ව්‍යුහගත වගුවකින් යාවත්කාලීන කිරීම සඳහා ය (මගේ නඩුවේ වෙබ් අඩවියේ ඩීබී සජීවී ඩීබී පරීක්‍ෂා කරන්න):

INSERT  live-db.table1
SELECT  *
FROM    test-db.table1 t
ON DUPLICATE KEY UPDATE
        ColToUpdate1 = t.ColToUpdate1,
        ColToUpdate2 = t.ColToUpdate2,
        ...

වෙනත් තැනක සඳහන් කළ පරිදි, ඔබට යාවත්කාලීන කිරීමට අවශ්‍ය තීරු පමණක් පසුව ඇතුළත් කළ යුතුය ON DUPLICATE KEY UPDATE .

INSERTහෝ ඊට SELECTවඩා වැඩි තීරු ලැයිස්තු ගත කිරීමට අවශ්‍ය නැත .


4

මගේ නඩුවේදී මම පහත විමසුම් නිර්මාණය කළ නමුත් පළමු විමසුමේදී id1 දැනටමත් තිබේ නම් සහ වයස දැනටමත් තිබේ නම්, ඉන් පසු ඔබ පළමු විමසුම නිර්මාණය කරන්නේ නම් ageඑහි වටිනාකමට වඩා ageකිසිවක් නැත

REPLACE into table SET `id` = 1, `name` = 'A', `age` = 19

ඉහත ගැටළුව මඟ හැරීම සඳහා පහත වැනි විමසුමක් සාදන්න

INSERT INTO table SET `id` = '1', `name` = 'A', `age` = 19 ON DUPLICATE KEY UPDATE `id` = "1", `name` = "A",`age` = 19

එය ඔබට උදව් වේවා ...


3
අපි අගයන් දෙවරක් පැවරිය යුත්තේ මන්දැයි යමෙක් දන්නවාද? සියලු පැවරුම් ප්‍රකාශයන් අනුපිටපත් නොකර ON DUPLICATE KEY UPDATE හි විමසුම අවසන් කිරීමට MySQL අපට ඉඩ නොදෙන්නේ ඇයි? සමහර දත්ත සමුදා වගු වල බොහෝ තීරු ඇති අතර මෙය අතිරික්ත / අනවශ්‍ය ලෙස පෙනේ. විකල්ප පැවරුම් සඳහා අපට විකල්පයක් ඇත්තේ මන්දැයි මට වැටහී ඇත, නමුත් ඒවා ද මඟ හැරීමට විකල්පයක් නැත්තේ ඇයි? කවුරුහරි දන්නවා නම් කුතුහලයෙන්.
බ්ලූ වෝටර්

4

ඔබට non-primaryක්ෂේත්‍රයක් නිර්ණායක / කොන්දේසියක් ලෙස සෑදීමට අවශ්‍ය නම් ON DUPLICATE, එය ක්‍රියාත්මක කිරීම සඳහා UNIQUE INDEXඑම වගුවේ යතුරක් සෑදිය හැකිය DUPLICATE.

ALTER TABLE `table` ADD UNIQUE `unique_index`(`name`);

ඔබට මේසය මත අද්විතීය වීමට ක්ෂේත්‍ර දෙකක් ඒකාබද්ධ කිරීමට අවශ්‍ය නම්, අවසාන පරාමිතිය මත තවත් එකතු කිරීමෙන් ඔබට මෙය සාක්ෂාත් කරගත හැකිය.

ALTER TABLE `table` ADD UNIQUE `unique_index`(`name`, `age`);

සටහන, අනෙක් පේළි හරහා සමාන nameහා ageවටිනාකමක් ඇති සියලුම දත්ත පළමුව මකා දැමීමට වග බලා ගන්න .

DELETE table FROM table AS a, table AS b WHERE a.id < b.id 
AND a.name <=> b.name AND a.age <=> b.age;

ඊට පසු, එය ON DUPLICATEසිදුවීම අවුලුවාලිය යුතුය .

INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE    
name = VALUES(name), age = VALUES(age)

2

ඔබට පැරණි ක්ෂේත්‍රය තබා ගැනීමට අවශ්‍ය නම් (උදා: නම). විමසුම වනුයේ:

INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE    
name=name, age=19;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.