2007 ඔක්තෝබර් 18
ආරම්භ කිරීමට: නවතම MySQL අනුව, මාතෘකාව තුළ ඉදිරිපත් කර ඇති සින්ටැක්ස් කළ නොහැක. නමුත් පවතින ක්රියාකාරීත්වය භාවිතා කර අපේක්ෂිත දේ ඉටු කර ගැනීම සඳහා ඉතා පහසු ක්රම කිහිපයක් තිබේ.
කළ හැකි විසඳුම් 3 ක් ඇත: INSERT IGNORE, REPLACE, හෝ INSERT… DUPLICATE KEY UPDATE භාවිතා කිරීම.
අපට මේසයක් ඇතැයි සිතන්න:
CREATE TABLE `transcripts` (
`ensembl_transcript_id` varchar(20) NOT NULL,
`transcript_chrom_start` int(10) unsigned NOT NULL,
`transcript_chrom_end` int(10) unsigned NOT NULL,
PRIMARY KEY (`ensembl_transcript_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
දැන් සිතන්න අපට එන්සෙම්බල් වෙතින් පිටපත් මෙටා-දත්ත ආනයනය කරන ස්වයංක්රීය නල මාර්ගයක් ඇති බවත්, විවිධ හේතූන් නිසා ඕනෑම පියවරක දී නල මාර්ගය කැඩී යා හැකි බවත්. මේ අනුව, අප කරුණු දෙකක් සහතික කළ යුතුය:
නල මාර්ගය නැවත නැවත ක්රියාත්මක කිරීමෙන් අපගේ දත්ත සමුදාය විනාශ නොවේ
'අනුපිටපත් ප්රාථමික යතුර' දෝෂ හේතුවෙන් නැවත නැවත ක්රියාත්මක කිරීම මිය නොයනු ඇත.
ක්රමය 1: REPLACE භාවිතා කිරීම
එය ඉතා සරල ය:
REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
වාර්තාව තිබේ නම්, එය නැවත ලියනු ලැබේ; එය තවමත් නොපවතී නම්, එය නිර්මාණය වනු ඇත. කෙසේ වෙතත්, මෙම ක්රමය භාවිතා කිරීම අපගේ නඩුව සඳහා කාර්යක්ෂම නොවේ: පවතින වාර්තා නැවත ලිවීමට අපට අවශ්ය නැත, ඒවා මඟ හැරීම හොඳයි.
ක්රමය 2: INSERT IGNORE භාවිතා කිරීම ද ඉතා සරල ය:
INSERT IGNORE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
මෙන්න, 'ensembl_transcript_id' දැනටමත් දත්ත ගබඩාවේ තිබේ නම්, එය නිහ ly ව මඟ හරිනු ඇත (නොසලකා හරිනු ලැබේ). (වඩාත් නිවැරදිව කිවහොත්, MySQL යොමු අත්පොතෙන් උපුටා දැක්වීමක් මෙහි දැක්වේ: “ඔබ IGNORE යතුරු පදය භාවිතා කරන්නේ නම්, INSERT ප්රකාශය ක්රියාත්මක කිරීමේදී සිදුවන දෝෂ ඒ වෙනුවට අනතුරු ඇඟවීම් ලෙස සලකනු ලැබේ. හෝ වගුවේ ඇති ප්රාථමික කේ අගය අනුපිටපත් යතුරු දෝෂයක් ඇති කර ප්රකාශය අහෝසි කර ඇත. ”.) වාර්තාව තවමත් නොපවතී නම්, එය නිර්මාණය වනු ඇත.
මෙම දෙවන ක්රමයට විභව දුර්වලතා කිහිපයක් ඇත, වෙනත් ගැටළුවක් ඇති වුවහොත් විමසුම ගබ්සා නොකිරීම ද ඇතුළුව (අත්පොත බලන්න). මේ අනුව IGNORE යතුරුපදය නොමැතිව කලින් පරීක්ෂා කර ඇත්නම් එය භාවිතා කළ යුතුය.
ක්රමය 3: ද්විත්ව කේ යාවත්කාලීන කිරීම සඳහා INSERT භාවිතා කිරීම:
තෙවන විකල්පය වන්නේ INSERT … ON DUPLICATE KEY UPDATE
සින්ටැක්ස් භාවිතා කිරීමයි , සහ යාවත්කාලීන කිරීමේ කොටසෙහි 0 + 0 ගණනය කිරීම වැනි අර්ථ විරහිත (හිස්) මෙහෙයුමක් නොකරන්න (මෙම ක්රියාව නොසලකා හැරීම සඳහා MySQL ප්රශස්තිකරණ එන්ජිම සඳහා id = id පැවරුම සිදු කිරීමට ජෙෆ්රේ යෝජනා කරයි). මෙම ක්රමයේ ඇති වාසිය නම් එය අනුපිටපත් ප්රධාන සිදුවීම් පමණක් නොසලකා හැරීම සහ වෙනත් දෝෂ මත තවමත් නතර වීමයි.
අවසාන දැනුම්දීමක් ලෙස: මෙම ලිපිය Xaprb විසින් දේවානුභාවයෙන්. නම්යශීලී SQL විමසුම් ලිවීම පිළිබඳ ඔහුගේ අනෙක් තනතුරෙන් විමසීමට ද මම උපදෙස් දෙමි.