FiveM MySQL Duplicate Entry Error 1062 แก้อย่างไร? วิธีแก้ Duplicate Key, Primary Key และ Unique Index โดยไม่ทำข้อมูลพัง

 ปัญหา FiveM MySQL/MariaDB Duplicate Entry มักเกิดตอน Resource พยายาม INSERT ข้อมูลใหม่ลง Database แต่ค่าบางอย่างที่กำหนดให้ต้องไม่ซ้ำกลับมีอยู่แล้ว เช่น Character ID, License, Plate, Phone Number, Business ID หรือ Primary Key

ข้อความที่พบได้บ่อย เช่น:

ERROR 1062 (23000): Duplicate entry '123' for key 'PRIMARY'
Duplicate entry 'ABC123' for key 'plate'
ER_DUP_ENTRY

MariaDB กำหนด Error 1062 เป็น ER_DUP_ENTRY และใช้ SQLSTATE 23000 โดย Error จะเกิดเมื่อค่าที่กำลัง Insert ชนกับ PRIMARY KEY หรือ UNIQUE key ที่กำหนดว่าค่านั้นต้องไม่ซ้ำกัน

สำหรับ FiveM ปัญหานี้อาจเกิดกับระบบ เช่น:

  • Character

  • Inventory

  • Garage

  • Vehicle Ownership

  • Phone

  • Business

  • Banking

  • Billing

  • Housing

  • Job

  • Whitelist

  • Ban

  • Logs

หลักสำคัญคือ อย่าแก้ Duplicate Entry ด้วยการลบ Unique Key หรือ Primary Key ทันที เพราะ Constraint เหล่านี้มักมีหน้าที่ป้องกันข้อมูลซ้ำตั้งแต่ต้น

แนวทางที่ถูกต้องคือ:

อ่านข้อความ Error → หา Table → หา Key → ตรวจค่าที่ซ้ำ → หาว่าทำไม Resource กำลัง Insert ซ้ำ → แก้ Logic หรือ Data ที่ต้นเหตุ

① FiveM Duplicate Entry คืออะไร

คือ Database ได้รับคำสั่งประมาณ:

INSERT INTO ...

แต่ค่าของ Column ที่ต้อง Unique มีอยู่ใน Table แล้ว

② Error 1062 คืออะไร

MariaDB ใช้ Error 1062 สำหรับกรณี Duplicate Entry บน key ที่ต้องไม่ซ้ำ เช่น Primary Key หรือ Unique Key

③ ตัวอย่าง

มีข้อมูลอยู่แล้ว:

id = 100

Resource พยายาม Insert ใหม่:

id = 100

ถ้า id เป็น Primary Key:

  • Database จะ Reject

④ PRIMARY KEY คืออะไร

Primary Key คือ Column หรือชุด Columns ที่ใช้ระบุแต่ละ Row แบบไม่ซ้ำ และหนึ่ง Table มี Primary Key ได้เพียงชุดเดียว

⑤ UNIQUE KEY คืออะไร

Unique Key หรือ Unique Index ใช้บังคับไม่ให้ค่าซ้ำใน Column หรือชุด Columns ที่กำหนด

⑥ PRIMARY KEY กับ UNIQUE ต่างกันอย่างไรแบบง่าย

PRIMARY KEY

ใช้ระบุ Row หลัก

UNIQUE

ใช้ป้องกันค่าซ้ำเพิ่มเติม

Table หนึ่งอาจมี:

  • Primary Key 1 ชุด

  • Unique Index หลายชุด

⑦ ตัวอย่าง FiveM

Table รถอาจมี:

id
plate
owner
vehicle

โดย:

id = PRIMARY KEY
plate = UNIQUE

ดังนั้นรถสองคันอาจมี id ต่างกัน แต่ถ้า plate ซ้ำก็ยัง Error ได้

⑧ อ่าน Error ให้ครบ

ตัวอย่าง:

Duplicate entry 'ABC123' for key 'plate'

ข้อมูลสำคัญคือ:

ABC123

และ:

plate

⑨ ถ้า Error บอก PRIMARY

เช่น:

Duplicate entry '100' for key 'PRIMARY'

ให้ตรวจ Primary Key ของ Table นั้น

⑩ ถ้า Errorบอกชื่อ Key

เช่น:

Duplicate entry '5551234' for key 'phone_number'

ให้ตรวจ Unique Index ที่เกี่ยวข้องกับ Phone Number

⑪ Duplicate Entry ไม่ใช่ Connection Error

ถ้า MariaDB ตอบ Error 1062 ได้ แสดงว่า Query ไปถึง Database แล้ว

จึงไม่ควรเริ่มแก้:

  • Host

  • Port

  • Password

โดยไม่มีเหตุผล

⑫ Duplicate Entry ไม่ใช่ Table Missing

Table มีอยู่และ Databaseกำลังตรวจ Constraint ของ Table นั้น

⑬ Duplicate Entry มักเป็น Data หรือ Application Logic

เช่น:

  • Resource Insert Row ซ้ำ

  • ID Generatorสร้างค่าซ้ำ

  • Migration Importข้อมูลเดิมซ้ำ

  • Retry Queryแล้ว Insertซ้ำ

⑭ สาเหตุอันดับแรก — Resource INSERT ซ้ำ

ตัวอย่าง:

Playerหนึ่งสร้าง Character

Resource Insert:

citizenid = ABC001

สำเร็จแล้ว

แต่ Code เรียก Insertอีกครั้งด้วยค่าเดิม

จึง Error

⑮ ทำไม Resourceอาจ Insertสองครั้ง

เช่น:

  • Eventถูกเรียกซ้ำ

  • Callbackทำงานสองครั้ง

  • Playerกด Submitซ้ำ

  • Retry Logicผิด

  • Resourceถูกออกแบบไม่ Idempotent

⑯ Double Click ทำให้ Duplicate ได้ไหม

ได้ในบาง UI

เช่น Playerกด:

Create Character

สองครั้งก่อน Buttonถูก Disable

⑰ Server Lag อาจทำให้ Playerกดซ้ำ

Playerคิดว่า:

  • ครั้งแรกไม่ทำงาน

จึงกดอีกครั้ง

แต่ Requestแรกอาจกำลังประมวลผลอยู่

⑱ UI ควร Disable Button หลัง Submit

ช่วยลด Duplicate Request

แต่ Database Unique Constraintยังควรอยู่เป็น Protectionชั้นสุดท้าย

⑲ อย่าลบ Unique Constraintเพียงเพราะ UIกดซ้ำ

เพราะจะทำให้ Databaseยอมรับข้อมูลซ้ำจริง

⑳ สาเหตุ — Import SQL ซ้ำ

ถ้า Dumpมี:

INSERT INTO ...

และ Importซ้ำบน Databaseที่มีข้อมูลอยู่แล้ว

อาจชน Unique Keyทันที

㉑ Restore Backup ซ้ำได้ไหม

ถ้า Restoreเข้าฐานข้อมูลที่มี Rowsเดิม:

  • Duplicate Entryเกิดได้

㉒ วิธีป้องกัน

ก่อน Restoreต้องรู้ว่า Databaseปลายทาง:

  • ว่าง

  • มีข้อมูลอยู่

  • จะ Merge

แบบไหน

㉓ MigrationกับRestoreไม่เหมือนกัน

Migration:

  • เปลี่ยน Schema/Dataตาม Version

Restore:

  • นำ Backupกลับมา

อย่าสับสน

㉔ Import Fresh Dataทับ Productionเสี่ยงมาก

อาจทำให้:

  • Duplicate IDs

  • Duplicate Players

  • Duplicate Vehicles

㉕ สาเหตุ — AUTO_INCREMENT ผิด

Tableบางตัวใช้ AUTO_INCREMENT สำหรับ ID

MariaDB ระบุว่าสามารถกำหนดค่าให้ AUTO_INCREMENT โดยตรงได้ แต่ถ้า Column นั้นเป็น Primary/Unique ค่าที่กำหนดต้องไม่ชนกับค่าที่มีอยู่

㉖ AUTO_INCREMENT คืออะไร

ระบบสร้างเลข ID ต่อเนื่องโดย Database

เช่น:

1
2
3
4

㉗ Resourceควร Insert IDเองไหม

ถ้า Columnถูกออกแบบเป็น AUTO_INCREMENT:

  • โดยทั่วไปไม่จำเป็นต้องกำหนด IDเอง

㉘ ตัวอย่าง

ไม่ควร Hardcode:

INSERT INTO logs (id, message)
VALUES (1, 'test');

ทุกครั้ง

เพราะ id = 1 จะซ้ำ

㉙ ให้ Databaseสร้าง ID

ถ้า Schemaออกแบบแบบนั้น

Resourceอาจ Insertเฉพาะ:

message

แล้วให้ AUTO_INCREMENTสร้าง ID

㉚ AUTO_INCREMENT Value ต่ำกว่าข้อมูลจริง

อาจต้องตรวจว่า Sequence/Counterสัมพันธ์กับข้อมูลหรือไม่

แต่ไม่ควรแก้ค่า Counterแบบสุ่ม

㉛ ข้อมูลถูก Importด้วย IDเดิมอาจมีผล

หลัง Migration/Restoreควรตรวจ:

  • Max ID

  • Auto Increment State

ถ้าเกิด Duplicate PRIMARYจาก IDsใหม่

㉜ สาเหตุ — Character Identifier ซ้ำ

เช่นระบบกำหนด:

citizenid
identifier
charid

เป็น Unique

แต่ Generatorสร้างค่าซ้ำ

㉝ Random Generatorไม่ได้แปลว่าจะไม่ซ้ำ

ถ้า Designไม่มี Collision Check:

  • สุ่มซ้ำได้

โดยเฉพาะ Identifierสั้น

㉞ Generatorควรตรวจ Collision

ก่อนใช้ IDใหม่ควรมี Logicป้องกันค่าที่มีอยู่

㉟ UUID คืออะไร

บางระบบใช้ Identifierที่ออกแบบให้มีโอกาสซ้ำต่ำมาก

แต่ Serverไม่จำเป็นต้องเปลี่ยนเป็น UUIDเพียงเพราะเจอ Errorครั้งเดียว

㊱ Plate ซ้ำเป็น Caseยอดนิยมใน Garage

Vehicle Resourceอาจ Generate License Plate

แต่ Plateที่สร้างมีอยู่แล้ว

㊲ Vehicle Plateควร Uniqueไหม

ใน Serverจำนวนมาก Plateใช้เป็น Identifierสำคัญของรถ

จึงมักต้องไม่ซ้ำ

แต่ Schemaจริงต้องดู Resource

㊳ Errorตัวอย่าง

Duplicate entry 'XYZ999' for key 'plate'

ให้ตรวจว่า:

  • Plateมีอยู่จริงไหม

  • Generatorตรวจ Plateก่อนหรือไม่

㊴ อย่าลบรถเดิมทันที

เพราะรถเดิมอาจเป็น Owned Vehicleที่ถูกต้อง

ต้องหาเหตุผลว่าทำไมรถใหม่ได้ Plateเดิม

㊵ เปลี่ยน Unique Plateเป็น Non-Uniqueดีไหม

โดยทั่วไปไม่ควร

เพราะ Systemsเช่น:

  • Garage

  • Police

  • Keys

อาจใช้ Plateระบุรถ

㊶ Phone Number ซ้ำ

Phone Resourceอาจ Generate Numberที่ต้อง Unique

ถ้า Generator Collision:

  • Characterใหม่อาจสร้างไม่ได้

㊷ Phone Numberควรตรวจ Existingก่อน Assign

ถ้าระบบกำหนด Unique

㊸ Business ID ซ้ำ

Business Scriptอาจสร้าง:

business_id

ด้วยชื่อหรือ IDที่ชนของเดิม

㊹ Business Nameเป็นUniqueเสมอไหม

ไม่จำเป็น

บาง Serverอนุญาตชื่อคล้าย/ซ้ำ

ต้องดู Schema

㊺ Slug/Codeอาจ Uniqueแทน Name

เช่น:

mechanic_bennys

เป็น Internal Identifier

㊻ Job Name ซ้ำ

ตอน Import Job SQLซ้ำอาจเจอ Duplicate Key

เช่น Jobเดิมมีอยู่แล้ว

㊼ Import Scriptใหม่แต่ Jobเดิมมี

ควรดู SQLว่า:

  • INSERTใหม่

  • UPDATE existing

แบบไหน

㊽ ไม่ควร Importซ้ำจน “ผ่าน”

เพราะอาจสร้างข้อมูลครึ่งเก่าครึ่งใหม่

㊾ INSERT คืออะไร

MariaDBใช้ INSERT เพื่อเพิ่ม Rowใหม่ และหาก Unique Keyชน ค่า Duplicateสามารถทำให้ Statementล้มเหลวตามปกติ

㊿ INSERT IGNORE คืออะไร

INSERT IGNORE สามารถเปลี่ยน Errorsบางประเภทให้เป็น Warnings และ Rowsที่ผิดอาจถูกข้ามหรือค่าบางอย่างถูกปรับตามชนิด Error

51. ใช้ INSERT IGNORE แก้ Duplicate ดีไหม

ไม่ควรใช้แบบอัตโนมัติ

เพราะมันอาจทำให้คุณมองไม่เห็นว่า:

  • Resourceกำลังสร้างข้อมูลซ้ำจริง

52. ตัวอย่าง

ถ้าคุณต้องสร้าง Characterใหม่ แต่ citizenid ซ้ำ

การใช้:

INSERT IGNORE

อาจทำให้ Character Rowไม่ถูก Insertเลย

แต่ Codeคิดว่ากระบวนการเดินต่อได้

53. ผลลัพธ์คือข้อมูลครึ่งเดียว

เช่น:

  • Characterไม่มี Row

  • Inventoryถูกสร้าง

  • Phoneถูกสร้าง

กลายเป็น Data Inconsistency

54. ON DUPLICATE KEY UPDATE คืออะไร

MariaDBรองรับ:

INSERT ... ON DUPLICATE KEY UPDATE

ถ้า Insertชน Primary/Unique Key ระบบจะเปลี่ยนไปทำ UPDATE Rowเดิมแทนตามคำสั่งที่กำหนด

55. เรียกว่า Upsert

แนวคิด:

  • ไม่มี Row → Insert

  • มี Row → Update

56. Upsertเหมาะกับอะไร

เหมาะเมื่อ Business Logicตั้งใจจริงว่า Recordหนึ่งควร:

  • มีหนึ่ง Row

  • ถ้ามีแล้วให้ Update

57. ตัวอย่าง Settings

เช่น Save Player Setting:

player_id + setting

ถ้ามี Rowแล้ว:

  • Update

อาจสมเหตุสมผล

58. Upsertไม่เหมาะกับอะไร

ไม่ควรใช้แก้ปัญหาที่จริง ๆ ต้องสร้าง Entityใหม่

เช่น:

  • Vehicleใหม่

  • Characterใหม่

แต่ ID Generatorกลับสร้าง IDซ้ำ

59. เพราะ Upsertอาจเขียนทับของเดิม

อันตรายมาก

60. ON DUPLICATE KEY UPDATE กับหลาย Unique Index

MariaDB documentation เตือนว่า หากมี Unique Indexมากกว่าหนึ่งชุดและมากกว่าหนึ่งชุดชนกัน ระบบจะ Updateตาม keyที่ matchแรก ดังนั้นจึงไม่ควรใช้รูปแบบนี้แบบไม่คิดใน Tableที่มีหลาย Unique Constraints

61. REPLACE คืออะไร

MariaDBมี REPLACE ซึ่งเมื่อชน Primary/Unique Key จะลบ Rowเดิมแล้ว Insert Rowใหม่

62. REPLACE ไม่ใช่ UPDATEธรรมดา

สำคัญมาก

เพราะ Behaviorคือ:

DELETE old row → INSERT new row

63. REPLACEเสี่ยงกับ FiveMไหม

มากถ้า Rowมี:

  • Foreign Relationships

  • Metadata

  • Created Date

เพราะ Rowเดิมถูกลบ

64. อย่าใช้ REPLACEแก้ Duplicate Character

โดยไม่เข้าใจผลกระทบ

65. เปรียบเทียบสามวิธี

INSERT

ซ้ำ → Error

INSERT ... ON DUPLICATE KEY UPDATE

ซ้ำ → Update

REPLACE

ซ้ำ → Deleteเดิมแล้ว Insertใหม่

MariaDB documentationแยก Behaviorเหล่านี้ไว้ชัดเจน

66. วิธีไหนดีที่สุด

ขึ้นอยู่กับ Business Logic

ไม่ใช่ Error Messageอย่างเดียว

67. Constraintมีไว้ทำอะไร

ป้องกัน Database Stateที่ไม่สมเหตุสมผล

เช่น:

  • Vehicle Plateเดียวกันหลาย Row

  • Character IDซ้ำ

68. การลบ Constraint คือการเอาระบบป้องกันออก

อาจทำให้ Errorหาย แต่ Dataเสียแทน

69. Duplicate Entryจึงเป็นสัญญาณ

Databaseกำลังบอก:

Applicationกำลังพยายามสร้างสิ่งที่ควรไม่ซ้ำ

70. ต้องหาคำตอบว่า “ทำไม”

ไม่ใช่เพียง “ทำอย่างไรให้ Errorหาย”

71. ขั้นแรก — ดู Errorเต็ม

ตัวอย่าง:

Duplicate entry 'ABC123' for key 'plate'

72. ขั้นสอง — หา Table

ดู Queryหรือ Stackว่ากำลัง Insert Tableไหน

73. ขั้นสาม — ดู Indexes

สามารถตรวจ Indexของ Tableผ่าน Database Tools หรือ SQL เช่น:

SHOW INDEX FROM your_table;

MariaDBรองรับ Primary, Unique และ Indexชนิดต่าง ๆ สำหรับการกำหนดและค้นข้อมูล

74. ขั้นสี่ — หา Rowเดิม

เช่นถ้า Keyคือ:

plate = ABC123

ตรวจ Rowที่มีค่านี้อยู่แล้ว

75. ใช้ SELECTก่อนแก้

เช่นแนวคิด:

SELECT *
FROM owned_vehicles
WHERE plate = 'ABC123';

เปลี่ยนชื่อ Table/Columnให้ตรง Serverจริง

76. อย่าลบ Rowทันที

ต้องรู้ว่า Rowเดิม:

  • ถูกต้อง

  • เสีย

  • Duplicateจาก Migration

อย่างไหน

77. ถ้า Rowเดิมถูกต้อง

ต้องแก้ Resourceไม่ให้สร้าง IDเดิม

78. ถ้า Rowเดิมเป็นข้อมูลเสีย

ค่อยวางแผน Cleanupหลัง Backup

79. ถ้ามี Duplicateจริงหลาย Rowsได้อย่างไรถ้ามี Unique Key

อาจเป็นเพราะ:

  • Constraintถูกเพิ่มภายหลัง

  • Dataมาจาก Tableอื่น

  • Unique Keyเคยถูกลบ

  • Valuesต่างกันในรายละเอียด

ต้องตรวจ Schemaจริง

80. Spaceต่างกันอาจถือเหมือนหรือต่าง

ขึ้นอยู่กับ:

  • Column Type

  • Collation

  • Data Normalization

จึงควร Inspectค่าจริง

81. Uppercase/Lowercaseอาจมีผล

ขึ้นกับ Collation

เช่น:

ABC123
abc123

อาจถูกมองเท่ากันในบาง Collations

82. Plate Generatorควร Normalize Case

ถ้า Serverต้องการ Plateแบบมาตรฐานเดียว

83. Trim Spaceสำคัญ

Input:

ABC123

กับ:

ABC123 

อาจสร้างปัญหา Comparison/Formatting

Applicationควร Normalize Input

84. Phone Numberก็เช่นกัน

ควร Normalize:

  • Prefix

  • Separator

ตาม Server Design

85. Duplicate Entryหลัง Database Migration

อาจเกิดเมื่อ Mergeข้อมูลจากสอง Server/Database

ทั้งสองมี:

id = 100

86. Mergeไม่ควร Copy Primary IDsตรง ๆ เสมอ

ต้องวาง Migration Strategy

87. Character IDsชนตอน Merge

อาจต้อง:

  • Remap IDs

  • Update Foreign References

นี่เป็นงานที่ควรทำอย่างระวัง

88. เปลี่ยน IDใน Tableเดียวไม่พอ

ถ้า Tablesอื่นอ้างถึง Character IDเดิม:

  • Relationshipsจะขาด

89. Foreign Referencesคืออะไร

ข้อมูล Tableอื่นที่อ้าง Entityหลัก

เช่น:

Character
→ Vehicles
→ Houses
→ Phone

90. Database Mergeจึงซับซ้อน

ไม่ควรแก้ Duplicateด้วย:

DELETE duplicate row

แบบสุ่ม

91. Duplicate Entryหลัง Import Jobs

อาจไม่ร้ายแรงเท่า Character Merge

แต่ต้องรู้ว่า SQLกำลัง:

  • Seed Data

ซ้ำ

92. Seed Data คืออะไร

ข้อมูลเริ่มต้น เช่น:

  • Jobs

  • Items

  • Grades

93. Seed Scriptควร Handle Existing Data

Developerอาจเลือก:

  • Ignore

  • Update

  • Delete/Recreate

ตาม Design

94. Resource Installerที่ดีควร Idempotentไหม

ถ้า Installerถูกออกแบบให้ Runซ้ำได้:

  • ควรไม่สร้าง Duplicate State

แต่ไม่ใช่ทุก Scriptทำแบบนั้น

95. Idempotent คืออะไร

ทำ Actionเดิมซ้ำแล้วผลสุดท้ายไม่เปลี่ยนเกินที่ตั้งใจ

96. FiveM Payment Systemsควรระวัง Idempotencyมาก

เพราะ Retryซ้ำอาจ:

  • Chargeสองครั้ง

  • Create Invoiceสองใบ

97. Duplicate Billing

ถ้า Invoice IDถูก Unique:

  • Errorอาจช่วยหยุด Duplicate

แต่ Root Causeยังต้องแก้

98. Duplicate Transaction ID

Banking Systemอาจใช้ Unique Transaction Reference

ถ้า Generatorซ้ำ:

  • Insert Fail

99. Transaction Referenceควร Unique

เพื่อแยกแต่ละ Transactionออกจากกัน

100. Duplicate Reward

ถ้า Reward Tableใช้ Unique Claim ID:

  • Constraintสามารถช่วยป้องกันรับ Rewardซ้ำ

101. Unique Constraintจึงมีประโยชน์ต่อ Economy

ช่วยป้องกัน Duplicateจาก Bugบางประเภท

102. เอา Unique Keyออกอาจเปิด Economy Exploit

เช่น Claim Rewardเดิมซ้ำได้หลาย Row

103. Duplication Exploitต่างจาก SQL Duplicate Error

SQL Duplicate Error

Databaseปฏิเสธ Recordซ้ำ

Item Dupe Exploit

Gameplayสร้าง Assetซ้ำผิดปกติ

แต่ทั้งสองอาจเชื่อมกันถ้า Script Logicไม่ดี

104. Error 1062อาจเป็นสิ่งที่ป้องกัน Dupe

บางกรณี Constraintกำลังทำงานถูกต้อง

105. อย่าแก้ด้วยการ Disable Protection

ควรแก้ Request Logic

106. Duplicate Entryจาก Concurrent Requests

Playerสอง Requestเกิดใกล้กันมาก

ทั้งสองตรวจ:

ไม่มี Row

พร้อมกัน

แล้วทั้งสองพยายาม Insert

107. Race Condition คืออะไร

หลาย Operationsเกิดพร้อมกันและแข่งขันกับข้อมูลเดียวกัน

108. Unique Constraintช่วย Race Condition

แม้ Applicationตรวจว่าไม่มี Record แต่ Databaseยังป้องกัน Insertซ้ำได้

109. Check-then-insertอย่างเดียวไม่พอ

แนวคิด:

SELECT exists?
↓
No
↓
INSERT

ยังมี Race Window

110. Database Constraintยังควรอยู่

เพื่อเป็น Source of Truthสุดท้าย

111. Developerควร Handle Duplicate Error

เช่น:

  • Retryด้วย IDใหม่

  • Return Already Exists

  • Updateตาม Business Logic

แทน Crash

112. Character Creation ตัวอย่าง

Generatorสร้าง:

ABC001

Databaseตอบ Duplicate

Codeควร Generate IDใหม่ถ้า Designเหมาะ

ไม่ควรลบ Characterเดิม

113. Vehicle Plate Generatorเหมือนกัน

หาก Plateชน:

  • Generateใหม่

อาจเหมาะกว่าเปลี่ยน Unique Constraint

114. Phone Number Generatorก็คล้ายกัน

ต้องรับมือ Collision

115. Unique Code Generatorควรมี Spaceเพียงพอ

ถ้า Codeสั้นเกินและ Playerเยอะ:

  • Collisionเพิ่มขึ้น

116. จำนวน Possibilitiesสำคัญ

เช่น Code 3หลักมีค่าที่เป็นไปได้จำกัด

Serverโตมากอาจชนง่าย

117. อย่าเพิ่ม Random Lengthแบบสุ่มใน Production

เพราะ UI/Schemaอาจจำกัด Length

118. VARCHAR Lengthต้องรองรับ IDใหม่

ก่อนเปลี่ยน Format

119. Migrationอาจต้องใช้ถ้าขยาย Identifier

Resourceทุกตัวที่ใช้ Identifierต้องรองรับด้วย

120. Error Duplicate Key Nameต่างจาก Duplicate Entryไหม

ต่างกัน

MariaDBมี Error 1061 สำหรับ Duplicate key name และ Error 1062 สำหรับ Duplicate entry

121. Duplicate Key Name คืออะไร

เกิดตอน Schemaพยายามสร้าง Indexชื่อที่มีอยู่แล้ว

เช่น Migration Runซ้ำ

122. Duplicate Entry คือข้อมูลชน

ส่วน Duplicate Key Nameคือ:

  • Schema Objectชื่อซ้ำ

123. Error 1060 ล่ะ

MariaDB Error 1060คือ:

  • Duplicate column name

มักเกิดตอน Migrationพยายามเพิ่ม Columnที่มีอยู่แล้ว

124. Error 1068

คือ Multiple Primary Key Defined

เกิดเมื่อ Tableพยายามกำหนด Primary Keyเกินหนึ่งชุด

125. จึงต้องแยก Duplicateแต่ละชนิด

Errorความหมายหลัก
1060Duplicate Column Name
1061Duplicate Key Name
1062Duplicate Entry
1068Multiple Primary Key

MariaDBระบุ Codesเหล่านี้แยกกันใน Error Reference

126. Error 1022 คืออะไร

MariaDBมี Error 1022:

Can't write; duplicate key in table

ซึ่งเกี่ยวกับ Duplicate Keyอีกกรณีหนึ่ง

127. FiveM Server Ownerควรจำทุก Error Numberไหม

ไม่จำเป็น

อ่านข้อความเต็มสำคัญกว่า

128. Duplicate Entryตอน Resource Start

อาจเป็น Seed/Migration Scriptพยายาม Insertข้อมูลที่มีอยู่

129. Duplicate Entryตอน Player Login

ตรวจ:

  • Session Record

  • Player Record

  • Identifier

130. Duplicate Entryตอน Character Creation

ตรวจ:

  • Character ID

  • Phone

  • Account Mapping

131. Duplicate Entryตอนซื้อรถ

ตรวจ:

  • Vehicle ID

  • Plate

  • Ownership Record

132. Duplicate Entryตอนซื้อบ้าน

ตรวจ:

  • Property ID

  • Ownership Mapping

133. Duplicate Entryตอนสร้าง Business

ตรวจ:

  • Business ID

  • Internal Code

134. Duplicate Entryตอนส่ง Billing

ตรวจ:

  • Invoice/Reference ID

ถ้า Systemใช้ Unique Reference

135. Duplicate Entryตอน Claim Reward

ตรวจ:

  • Claim ID

  • Player Reward Record

136. Duplicate Entryตอน Register Job

อาจ Seed Jobเดิมซ้ำ

137. Duplicate Entryตอน Server Restart

ถ้า Startup Script Insertค่า Defaultทุกครั้งโดยไม่ตรวจ

138. Example Config Seed

Resource Start:

INSERT default settings

ทุก Restart

ถ้า Key Unique:

  • Errorทุกครั้งหลัง Restartครั้งแรก

139. วิธีแก้

Installer/Seederควรออกแบบให้:

  • Insertเฉพาะไม่มี

  • หรือ Upsertถ้า Logicต้อง Update

140. ไม่ควรลบ Default Rowก่อนทุก Restart

เพราะ Settings Player/Adminอาจหาย

141. Duplicate Entryใน Logs Tableควรมีไหม

Logsมักควรมี Unique IDต่อ Event

ถ้า ID Generatorผิดจะ Error

142. AUTO_INCREMENTเหมาะกับ Log ID

ในหลาย Design

เพราะไม่ต้อง Generateเอง

143. UUIDก็ใช้ได้

ขึ้นกับ Architecture

แต่ไม่ต้องเปลี่ยน Database Modelถ้าไม่มีเหตุผล

144. Primary Key Composite คืออะไร

Primary Keyที่ประกอบด้วยหลาย Columns

เช่น:

player_id + reward_id

เพื่อให้ Playerหนึ่ง Claim Rewardหนึ่งครั้ง

145. Duplicate Entryแบบ Composite

Error Valueอาจแสดงค่าหลายส่วนรวมกัน

ต้องดู Key Definition

146. Composite Uniqueมีประโยชน์ FiveM

เช่น:

  • Player + Item Slot

  • Player + Reward

  • Business + Employee

ตาม Data Model

147. ถ้า Duplicate Compositeเกิดขึ้น

ไม่ได้แปลว่าแต่ละ Columnซ้ำผิด

แต่ Combinationทั้งหมดซ้ำ

148. ตัวอย่าง

มีอยู่แล้ว:

player = 10
reward = daily

Insertซ้ำ Combinationเดิม:

  • Error

149. นี่อาจเป็น Protectionที่ตั้งใจ

ป้องกัน Daily Rewardซ้ำ

150. อย่าแก้ Unique Constraintโดยไม่รู้ Business Rule

เพราะมันอาจมีไว้ป้องกัน Abuseโดยตรง

151. วิธีดู Primary/Unique Keys

ใช้:

SHOW CREATE TABLE your_table;

หรือ:

SHOW INDEX FROM your_table;

152. SHOW CREATE TABLEสำคัญ

เพราะเห็น:

  • Primary Key

  • Unique Keys

  • Column Types

พร้อมกัน

153. ถ้า Keyชื่อ PRIMARY

ดู Definitionของ Primary Key

154. ถ้า Keyชื่อ Custom

เช่น:

unique_plate

ดูว่า Indexใช้ Columnใด

155. Keyอาจประกอบหลาย Columns

อย่าดูชื่อ Errorแล้วเดาเพียง Columnเดียว

156. Backupก่อน DELETE Duplicate Data

จำเป็น

157. วิธีลบ Duplicate Rowต้องรู้ว่า Rowไหนถูก

อย่าทำ:

DELETE ...

ก่อนตรวจ Ownership/Relations

158. Data Cleanupควรเริ่มจาก SELECT

หา Rowsก่อน

159. Export Rowsที่กำลังจะแก้

ช่วย Recoveryถ้าตัดสินใจผิด

160. Production Duplicate Cleanupต้องระวัง Relationships

เช่น Vehicle Rowอาจเชื่อม:

  • Keys

  • Finance

  • Garage

161. ลบรถ Duplicateหนึ่ง Rowอาจทำ Key Recordsกำพร้า

เรียกว่า Orphan Data

162. Orphan Data คืออะไร

Recordใน Tableรองที่อ้าง Entityหลักซึ่งไม่มีแล้ว

163. Database Constraint Foreign Keyช่วยได้ไหม

บาง Schemasใช้ Foreign Keysเพื่อป้องกันบางกรณี

แต่ FiveM Resourcesไม่ได้ใช้เหมือนกันทั้งหมด

164. ตรวจ Resource Relationsก่อน Cleanup

สำคัญกว่าแก้ Errorเร็ว ๆ

165. ถ้า Duplicateเกิดจาก Test Data

อาจ Cleanได้ง่ายกว่า Production Player Data

แต่ Backupยังควรมี

166. อย่าใช้ Production Tableเป็นสนามทดลอง

ใช้:

  • Staging

  • Backup Copy

ถ้าเป็น Migrationใหญ่

167. Duplicate Entryหลัง Clone Database

ถ้า Test Serverเชื่อม Production Databaseโดยผิดพลาด:

  • อาจสร้างข้อมูลชนได้

168. Test Serverควรใช้ Databaseแยก

โดยเฉพาะ Character/Vehicle IDs

169. Development Resourceยิง Queryเข้า Productionอันตรายมาก

อาจ:

  • Create

  • Update

  • Duplicate

ข้อมูลจริง

170. ตรวจ Connection Stringของ Dev/Test

ก่อนเปิด Serverทดสอบ

171. Duplicate Entryอาจช่วยเตือนว่าคุณต่อ DBผิดตัว

เช่น Test Character IDชน Production Character

172. Server Migration Checklist

  • Backup

  • Databaseปลายทางถูก

  • IDsไม่ชน

  • Resourcesตรง Version

  • Migrationsครบ

173. Database Mergeต้องมี Planเฉพาะ

อย่าเพียง:

Import A
Import B

เข้าตารางเดียว

174. Merge Player IDs

ต้องตรวจ:

  • Account Mapping

  • Character IDs

  • Foreign Data

ทั้งหมด

175. Server Ownerมือใหม่ไม่ควร Mergeฐานข้อมูลใหญ่เองถ้าไม่เข้าใจ Relations

เพราะ Error 1062อาจเป็นเพียงปัญหาแรก

176. Duplicate Entryหลัง Migrationอาจเกิดหลาย Tables

เพราะ IDชนกันเป็น Chain

177. Fix Tableแรกแล้ว Tableต่อไปอาจชน

จึงต้องวาง ID Remappingทั้งระบบ

178. ID Remapping คืออะไร

เปลี่ยน IDsพร้อม Update Referencesทั้งหมด

179. ไม่ใช่แค่ id + 1000

ถ้ามี Referencesหลาย Tableต้อง Updateตาม

180. Resourceใช้ String Identifierอาจ Mergeง่าย/ยากต่างกัน

ขึ้นกับ Data Model

181. Duplicate Entryจาก Plateมักแก้ง่ายกว่า Character ID Merge

เพราะ Scopeอาจเล็กกว่า

แต่ก็ต้องตรวจ Keys/Ownership

182. Plate Changeควรทำผ่าน Official Vehicle Systemถ้ามี

เพื่อให้ Related Tables Sync

183. Manual UPDATE Plateอาจทำข้อมูลอื่นไม่ตรง

เช่น:

  • Vehicle Keys

  • Impound

  • Finance

ถ้า Tablesเหล่านั้นเก็บ Plate

184. Phone Number Changeก็เหมือนกัน

Phone Resourceอาจมี:

  • Contacts

  • Messages

  • Calls

เชื่อมกับ Number

185. อย่าแก้ Unique Identifierเพียง Tableเดียวโดยไม่รู้ Relations

หลักเดียวกันใช้กับ:

  • Business ID

  • Character ID

186. Duplicate Character Nameต่างจาก Character ID

ชื่อ Characterอาจซ้ำได้หรือไม่ได้ตาม Server Design

อย่าคิดว่าต้อง Uniqueเสมอ

187. Database Constraintเป็น Source of Truth

ถ้า Schemaไม่ได้ตั้ง Character Name Unique:

  • Duplicate Namesอาจได้รับอนุญาต

188. Email/Discord Identifierใน OOC Table

อาจถูกตั้ง Uniqueเพื่อป้องกัน Accountซ้ำ

แต่ต้องดู Resource

189. Whitelist Duplicate

Playerอาจถูก Add Whitelistซ้ำ

ถ้า Identifier Unique:

  • Error

190. Seederควร Update Existingแทน Insertใหม่ในบางกรณี

เช่น Whitelist Statusของคนเดิม

191. Ban Table Duplicate

บาง Systemsอาจอนุญาตหลาย Ban Recordsต่อ Playerเพื่อ History

ดังนั้น Identifierไม่ควร Uniqueเสมอไป

192. ถ้า Developerตั้ง Uniqueผิด

ก็เป็น Schema Design Bugได้

แต่ต้องพิสูจน์จาก Resource Logic

193. อย่าเอา Constraintออกเพราะ “คิดว่า” Developerผิด

ตรวจ Documentation/Codeก่อน

194. Duplicate Entryอาจเกิดจาก Migrationสร้าง Unique Indexบน Dataที่มีซ้ำ

เช่นก่อนหน้า Tableอนุญาต Plateซ้ำ

Versionใหม่ Add:

UNIQUE plate

Migrationอาจ Failเพราะ Dataเก่ามี Plateซ้ำ

195. ต้อง Clean Dataก่อน Add Unique

นี่เป็น Migration Problem

196. Errorใน Caseนี้อาจไม่ใช่ INSERT

อาจเกิดตอน:

ALTER TABLE

เพิ่ม Unique Constraint

197. Errorข้อความยังบอก Duplicate Entryได้

เพราะ Existing Dataขัดกับ Constraintใหม่

198. วิธีแก้

  1. หา Duplicate Values

  2. ตัดสินว่า Rowไหนถูก

  3. Remap/Removeอย่างปลอดภัย

  4. ค่อยเพิ่ม Constraint

199. อย่าลบ Constraintใหม่เพราะ Migration Failทันที

ถ้า Constraintมีเหตุผลด้าน Data Integrity

200. Find Duplicate Valuesอย่างไรเชิงแนวคิด

ใช้:

SELECT column_name, COUNT(*)
FROM table_name
GROUP BY column_name
HAVING COUNT(*) > 1;

เปลี่ยน Table/Columnให้ตรงระบบจริง

201. Queryนี้ใช้ตรวจ

ไม่แก้ Data

จึงเหมาะกับ Diagnosis

202. Composite Duplicateก็ตรวจหลาย Columns

เช่น:

GROUP BY player_id, reward_id

ตาม Keyจริง

203. Data Cleanupต้องมี Business Decision

ถ้าพบ Plateซ้ำสองคัน:

  • รถไหนควรเปลี่ยน Plate?

  • รถไหนเป็น Legacy?

  • Ownershipถูกไหม?

ไม่ใช่ SQL Decisionอย่างเดียว

204. Staff/Ownerอาจต้องตรวจ Logs

เพื่อรู้ว่า Rowใดสร้างก่อน/หลัง

205. created_atมีประโยชน์

ถ้ามี Timestampถูกต้อง

ช่วยดู History

206. แต่ Oldestไม่ได้แปลว่าถูกเสมอ

อาจเป็น Rowเก่าที่ Bugสร้าง

ต้องดู Context

207. Duplicate Keyใน Character Dataอาจร้ายแรง

อย่าลบ Player Rowโดยไม่มี Backup

208. Duplicate Keyใน Seed Tableอาจง่ายกว่า

แต่ยังต้องดูว่า Resourceต้องการ Updateหรือ Replace

209. INSERT IGNOREกับ Seed Dataอาจเหมาะบางกรณี

ถ้า Developerตั้งใจว่า Existing Rowให้คงเดิม

แต่ต้องเป็น Designที่ชัดเจน ไม่ใช่ Patchสุ่ม

210. Upsertกับ Config Tableอาจเหมาะ

เช่น:

setting_name = unique

ถ้ามีแล้ว:

  • Update Value

211. REPLACEควรระวังมากที่สุด

เพราะ MariaDBระบุว่า Rowเดิมจะถูกลบก่อน Insert Rowใหม่เมื่อชน Unique/Primary Key

212. Foreign Keysอาจทำ REPLACEมี Side Effects

เพราะ Deleteสามารถกระทบ Relationsตาม Constraints

213. Application Hooksอาจต่าง

ถ้ามี Triggers/Logs

Delete+Insertไม่เท่ากับ Update

214. FiveM Server Ownerไม่ควรเปลี่ยน INSERTเป็นREPLACEทั้ง Resource

เพียงเพื่อหยุด Error

215. Error Handlingที่ดีควร Specific

ถ้า Duplicate Character ID:

  • Generateใหม่

ถ้า Duplicate Setting:

  • Update

ถ้า Duplicate Claim:

  • Rejectเป็น Already Claimed

216. Business Logicสำคัญกว่า Syntax

SQLมีหลายวิธีจัดการ Duplicate แต่ต้องเลือกให้ตรงความหมายข้อมูล

217. Duplicate Rewardควร Reject

ไม่ควร Upsertแล้วให้ Rewardซ้ำ

218. Duplicate Session Recordอาจ Update

ขึ้นอยู่กับ Session Design

219. Duplicate Player Preferencesอาจ Update

เหมาะกับ One-row-per-player settings

220. Duplicate Vehicleควรไม่ Updateรถเดิมด้วยข้อมูลรถใหม่

อันตราย

221. Duplicate Invoice Referenceควร Generate Referenceใหม่

มากกว่าจะ Update Invoiceเก่า

222. Duplicate Transaction Referenceก็เช่นกัน

อย่าเขียนทับ Transactionเดิม

223. Duplicate Phone Numberควร Generateใหม่

ถ้า Phone Numberต้อง Unique

224. Duplicate Character IDควร Generateใหม่

หากเกิด Collisionตอนสร้าง Character

225. Duplicate Business Internal IDอาจ Generateใหม่

แต่ Business Display Nameอาจยังเหมือนกันได้ถ้า Rulesอนุญาต

226. Duplicate Entryจาก Player Retryหลัง Timeout

สถานการณ์:

  1. Requestแรกสำเร็จ

  2. Clientไม่ได้รับ Response

  3. Client Retry

  4. Databaseตอบ Duplicate

227. นี่ไม่ได้หมายความว่า Requestแรกล้มเหลว

สำคัญมาก

228. Clientควรตรวจ Existing Result

แทนสร้างซ้ำ

229. Idempotency Keyช่วยได้ไหม

ในระบบ Transactionสมัยใหม่สามารถใช้ Unique Request IDป้องกัน Retryสร้างผลซ้ำ

FiveM Custom Resourceก็สามารถออกแบบแนวคิดนี้ได้

230. Database Unique Keyเหมาะเป็น Idempotency Guard

เช่น:

request_id

Unique

Retryเดิมจึงไม่สร้าง Paymentใหม่

231. Errorอาจถูก Handleเป็น Successของ Requestเดิม

แต่ต้องพิสูจน์ว่า Recordเดิมคือ Requestเดียวกันจริง

232. อย่า Treatทุก Duplicateเป็น Success

เพราะอาจชน Recordของคนอื่นจริง

233. Duplicate Errorต้องมี Context

  • Keyอะไร

  • Valueอะไร

  • Operationอะไร

234. Loggingควรบันทึก Context

เช่น:

  • Resource

  • Action

  • Character

โดยไม่เปิดเผยข้อมูลลับเกินจำเป็น

235. SQL Error Logช่วย Debug

แต่ Password/Connection Stringไม่ควร Log Public

236. Resource Error Stackช่วยหา Source

ค้น:

  • File

  • Line

  • Query

237. ถ้าเป็น Closed-source Resource

ใช้:

  • Official Support

  • Documentation

  • SQL Files

แทนการเดา

238. อย่า Patch Databaseรุนแรงเพื่อ Resourceเดียว

ถ้า Resourceมี Versionผิด

Update/Replace Resourceอาจเหมาะกว่า

239. Duplicate Entryหลัง Resource Update

ตรวจ:

  • Migration

  • New Unique Constraints

  • Seeder Changes

240. Duplicate Entryหลัง Framework Update

ตรวจ Compatibilityของ Resourcesที่เขียน Dataลง Core Tables

241. Duplicate Entryหลัง Database Restore

ตรวจว่ากำลัง Restoreทับ Databaseเดิมหรือเปล่า

242. Duplicate Entryหลัง Server Clone

ตรวจว่า Cloneทั้งสอง Serverกำลังใช้ Databaseเดียวกันหรือไม่

243. สอง FiveM Serversใช้ DBเดียวกันได้ไหม

ทาง Technicalอาจทำได้ในบาง Architecture

แต่ถ้า Resourcesไม่ได้ออกแบบ Multi-server:

  • ID Collisions

  • Shared State Problems

อาจเกิด

244. Server A กับ Server B Generate IDเหมือนกัน

ถ้าเขียน Tableเดียวกัน:

  • Duplicate Entry

เกิดได้

245. Multi-server Architectureต้องมี ID Strategy

เช่น Unique IDsที่ไม่ชนข้าม Instances

246. Server Ownerทั่วไปไม่ควร Share Core Databaseโดยไม่ได้ออกแบบ

โดยเฉพาะ:

  • Character

  • Vehicles

  • Transactions

247. AUTO_INCREMENTใน Multi-server Databaseเดียว

ถ้าทั้งสองใช้ Database Tableเดียวกันจริง Databaseสามารถจัด Counterกลางได้

แต่ถ้าแต่ละ Serverมี Local DBแล้ว Mergeภายหลัง IDsอาจชน

248. Mergeภายหลังยากกว่าการออกแบบตั้งแต่ต้น

ดังนั้นควรวาง Data Strategyก่อน

249. Error 1062ไม่ควรถูก Ignoreใน Production Logs

แม้ Gameplayดูปกติ

เพราะอาจบอก:

  • Retry Bug

  • Data Collision

250. Errorเกิดครั้งเดียวหลัง Import

อาจเป็น Migrationเฉพาะกิจ

แต่ต้องรู้ว่าอะไรถูกข้าม

251. Errorเกิดทุก Player Join

เป็น Bugถาวร

ต้องแก้ทันที

252. Errorเกิดทุก Restart

Startup Seed/Migrationอาจ Runซ้ำ

253. Errorเกิดทุกซื้อรถ

Plate/ID Generatorน่าสงสัย

254. Errorเกิดทุกสร้าง Character

Identifier Generator/Schemaน่าสงสัย

255. Errorเกิดบางครั้งเท่านั้น

อาจเป็น:

  • Random Collision

  • Race Condition

  • Retry

256. Random Collisionจะเกิดยากแค่ไหน

ขึ้นกับ Identifier Spaceและจำนวน Records

ไม่มีค่ากลาง

257. อย่าคิดว่า “สุ่ม 6หลักไม่มีทางซ้ำ”

ยังมีความเป็นไปได้

Databaseควรตรวจสุดท้าย

258. Collision Retryควรมีจำนวนจำกัด

ไม่ควร Loopไม่สิ้นสุด

259. หาก ID Spaceเต็ม

Generateใหม่ก็จะชนบ่อย

ต้องขยาย Design

260. Phone Number Poolเต็มได้ไหม

ถ้า Serverใช้ช่วงหมายเลขเล็กและ Playersมาก:

  • ได้

261. Plate Spaceก็มี Limitเชิง Combination

แม้โดยทั่วไปอาจใหญ่พอ

แต่ Custom Formatสั้นมากเพิ่มโอกาสชน

262. Unique Constraintช่วยบอกว่า Poolเริ่มมีปัญหา

ดู Collision Rate

263. Monitoring Duplicate Errorsมีประโยชน์

ถ้า Errorเพิ่มขึ้น:

  • Generatorอาจต้องปรับ

264. Error Rateเป็น Signal

ไม่จำเป็นต้องรอ Playerแจ้งก่อน

265. Database Metricsไม่ต้องซับซ้อนสำหรับ Serverเล็ก

อย่างน้อยอ่าน Console/Logsเป็นประจำ

266. Duplicate Errorกับ Exploit Attempt

ถ้า Playerส่ง Requestซ้ำจำนวนมาก:

  • อาจเป็น Abuse

  • หรือ UI Bug

อย่ารีบกล่าวหาโดยไม่มี Evidence

267. Rate Limitช่วยได้

ป้องกัน Requestซ้ำเร็วเกิน

แต่ไม่แทน Unique Constraint

268. Server-side Validationสำคัญ

อย่าเชื่อ Clientว่า IDนั้น Unique

Database/Serverควรตรวจ

269. Client-generated IDใช้ได้ไหม

ใช้ได้ในบาง Design แต่ต้องมี Collision Handling

270. Server-generated IDมักควบคุมง่ายกว่า

สำหรับบาง Entity

แต่ Architectureเป็นผู้กำหนด

271. Duplicate Entry Troubleshooting Flow

Error 1062
↓
Read duplicate value
↓
Read key name
↓
Identify table
↓
SHOW CREATE TABLE / SHOW INDEX
↓
SELECT existing row
↓
Find insert source
↓
Determine intended behavior
↓
Fix generator/retry/migration
↓
Test

272. Checklistก่อนแก้

  • Backup Database

  • Capture Errorเต็ม

  • รู้ Resource

  • รู้ Table

  • รู้ Key

  • รู้ Duplicate Value

273. Checklistถ้าเป็น Primary Key

  • AUTO_INCREMENTไหม

  • Resourceส่ง IDเองไหม

  • Import/Restoreซ้ำไหม

  • Multi-server Mergeไหม

274. Checklistถ้าเป็น Unique Plate

  • Plateมีอยู่จริงไหม

  • Generatorตรวจ Collisionไหม

  • Resourceถูกเรียกสองครั้งไหม

275. Checklistถ้าเป็น Phone Number

  • Number Generator

  • Existing Character

  • Migration

  • Duplicate Account Creation

276. Checklistถ้าเป็น Seed/Jobs

  • SQLเคย Importแล้วหรือยัง

  • Scriptควร Update existingหรือไม่

277. Checklistหลัง Migration

  • Unique Indexใหม่

  • Existing Duplicates

  • Partial Migration

  • Resource Version

278. สิ่งที่ไม่ควรทำ

  • ลบ Primary Key

  • ลบ Unique Index

  • DELETE Rowแบบสุ่ม

  • ใช้ REPLACEทุก Query

  • INSERT IGNOREทั้ง Resource

  • Reset Databaseทันที

279. ทำไมไม่ควรลบ Primary Key

Primary Keyมีหน้าที่หลักในการระบุ Rowและรักษาความเป็นเอกลักษณ์ของ Record

280. ทำไมไม่ควรลบ Unique Index

มันอาจเป็น Business Constraintสำคัญ เช่น:

  • Plateต้องไม่ซ้ำ

  • Phoneต้องไม่ซ้ำ

281. ทำไมไม่ควรใช้ INSERT IGNOREทุกจุด

MariaDBระบุว่า IGNORE สามารถเปลี่ยน Errorsเป็น Warnings และทำให้ Rowsที่เกิด Errorsถูกข้ามหรือค่าบางชนิดถูกปรับ ซึ่งอาจซ่อนต้นเหตุของข้อมูลผิดได้

282. ทำไมไม่ควรใช้ REPLACEทุกจุด

เพราะ REPLACEสามารถลบ Rowเดิมเมื่อ Unique Keyชนแล้ว Insert Rowใหม่ ซึ่งไม่เท่ากับ Updateธรรมดา

283. ทำไม Upsertก็ต้องระวัง

เพราะถ้า Collisionไม่ใช่ Entityเดียวกันจริง:

  • คุณอาจ Updateข้อมูลของคนอื่น

284. Fixที่ดีที่สุด

ขึ้นอยู่กับ Intent:

Entityใหม่แต่IDซ้ำ

Generate IDใหม่

RecordเดิมควรถูกUpdate

ใช้ Update/Upsertที่เหมาะ

RequestเดิมถูกRetry

ใช้ Idempotency

MigrationมีDataซ้ำ

Clean/Migrate Data

285. Data Integrityมาก่อน Consoleสวย

อย่าแก้เพียงให้ข้อความแดงหาย

286. FiveM Economyเสียได้จาก Duplicate Handlingผิด

เช่น:

  • รถถูกเขียนทับ

  • Paymentซ้ำ

  • Rewardซ้ำ

287. Character Dataก็เสียได้

ถ้า Upsert Rowผิด Character

288. Backupก่อนแก้ Production

โดยเฉพาะก่อน:

  • DELETE

  • UPDATE IDs

  • DROP INDEX

  • ALTER TABLE

289. SELECTเป็นขั้นแรกที่ปลอดภัยกว่า

ตรวจ Rowและ Indexก่อนเปลี่ยน Data

290. SHOW CREATE TABLEช่วยยืนยัน Schema

อย่าเดา Keyจากชื่อ Columnเพียงอย่างเดียว

291. Error 1062 FAQ

FiveM Duplicate Entry Error 1062 คืออะไร

MariaDBปฏิเสธค่าที่ซ้ำกับ Primary Keyหรือ Unique Keyที่มีอยู่แล้ว

Duplicate entry '1' for key 'PRIMARY' คืออะไร

ค่าของ Primary Key 1 มีอยู่แล้ว แต่ Queryพยายาม Insertอีก Rowด้วยค่าเดียวกัน

ต้องลบ Rowเก่าไหม

ไม่ควรทันที ต้องตรวจว่า Rowเก่าถูกต้องหรือเป็นข้อมูลเสีย

ต้องลบ Primary Keyไหม

ไม่แนะนำ เพราะจะทำลายข้อจำกัดสำคัญของ Table

ต้องลบ Unique Indexไหม

ไม่ควรเว้นแต่พิสูจน์แล้วว่า Schema Designผิดจริง

Duplicate Plateแก้อย่างไร

ตรวจ Vehicle Rowเดิมและแก้ Plate Generator/Collision Handling

Duplicate Phone Numberแก้อย่างไร

ตรวจ Number Generatorและ Existing Characterก่อนแก้ข้อมูล

Duplicate Character IDแก้อย่างไร

ต้องแก้ ID Generatorหรือ Migration ไม่ควรเขียนทับ Characterเดิม

AUTO_INCREMENTเกี่ยวไหม

เกี่ยวได้ หาก Applicationกำหนด IDเองหรือ Sequence/ข้อมูลหลัง Importไม่สอดคล้องกัน; MariaDBอนุญาตการกำหนดค่า AUTO_INCREMENTโดยตรง แต่ค่าที่เป็น Primary/Uniqueต้องไม่ซ้ำ

INSERT IGNORE แก้ได้ไหม

อาจข้าม Duplicate Errorได้ในบางกรณี แต่ไม่ควรใช้เป็น Fixทั่วไป เพราะอาจซ่อนปัญหา Data/Logic

ON DUPLICATE KEY UPDATE ใช้ได้ไหม

ได้เมื่อ Logicต้องการ Update Recordเดิมจริง ๆ เมื่อ Unique/Primary Keyชน

REPLACE ใช้ได้ไหม

มีได้ แต่ต้องระวังเพราะ Rowเดิมอาจถูก Deleteแล้ว Insertใหม่

Errorเกิดหลัง Import SQLทำอย่างไร

ตรวจว่า Importข้อมูลเดิมซ้ำหรือกำลัง Run Seed/Migrationซ้ำ

Errorเกิดหลัง Restore Backup

ตรวจว่า Restoreทับ Databaseที่มีข้อมูลเดิมหรือไม่

Errorเกิดหลัง Update Resource

ตรวจ Migrationและ Unique Constraintsใหม่

Errorเกิดเฉพาะบางครั้ง

อาจเป็น Random Collision, Concurrent Requestsหรือ Retry

Errorทุก Restart

ตรวจ Startup Seeder/Installerที่ Insertค่าเดิมซ้ำ

Errorทุกครั้งที่ซื้อรถ

ตรวจ Vehicle IDหรือ Plate Generator

Errorทุกครั้งที่สร้าง Character

ตรวจ Character Identifier Generatorและ Account Mapping

Errorทุกครั้งที่ Claim Reward

Unique Constraintอาจกำลังป้องกันการ Claimซ้ำ หรือ Resourceอาจสร้าง Claim Recordซ้ำผิด Logic

Clear FiveM Cacheช่วยไหม

โดยทั่วไปไม่ใช่ Fixของ Database Duplicate Entry

Restart MariaDBช่วยไหม

ไม่ ถ้า Queryยัง Insertค่าซ้ำเดิม Errorจะกลับมา

Reinstall Databaseช่วยไหม

ไม่ควรทำ และเสี่ยง Data Lossโดยไม่แก้ Root Cause

สรุป FiveM MySQL Duplicate Entry Error 1062

FiveM MySQL/MariaDB Duplicate Entry Error 1062 เกิดเมื่อ Resource พยายาม Insert ค่าที่ชนกับ PRIMARY KEY หรือ UNIQUE key ที่มีอยู่แล้ว โดย MariaDB กำหนด Error นี้เป็น ER_DUP_ENTRY และ SQLSTATE 23000

สาเหตุที่พบบ่อยคือ:

Resource Insertซ้ำ → Playerกด Actionซ้ำ → Retry Logicผิด → ID/Plate/Phone Generatorชน → Import SQLซ้ำ → Restoreทับข้อมูลเดิม → Migrationเพิ่ม Unique Constraintบนข้อมูลที่มี Duplicateอยู่แล้ว

สิ่งที่ comsiam แนะนำคือเมื่อพบ Error 1062 อย่าเริ่มจากการลบ PRIMARY KEY หรือ UNIQUE INDEX เพราะ Constraintเหล่านี้อาจกำลังช่วยป้องกัน Character, Vehicle, Transaction หรือ Reward ซ้ำอยู่ ให้ตรวจ Duplicate Value, Key Name, Existing Row และ Queryต้นทางก่อน แล้วแก้ Logicให้ตรงกับความหมายของข้อมูลจริง

อีกหลักที่ comsiam แนะนำคืออย่าใช้ INSERT IGNORE, REPLACE หรือ ON DUPLICATE KEY UPDATE เป็นยาครอบจักรวาล แม้ MariaDBจะมีเครื่องมือเหล่านี้สำหรับจัดการ Duplicate แต่แต่ละคำสั่งมี Behaviorต่างกันอย่างมาก: IGNORE สามารถข้าม Error, ON DUPLICATE KEY UPDATE เปลี่ยนไป Update Recordเดิม และ REPLACE อาจลบ Rowเดิมแล้ว Insertใหม่ ดังนั้นต้องเลือกตาม Business Logicของ Resource ไม่ใช่เลือกเพียงเพราะทำให้ Consoleหยุดขึ้น Error

Comments

Popular posts from this blog

FiveM ยังน่าเล่นไหม? Enhanced เปลี่ยน FiveM แค่ไหน

FiveM คืออะไร เล่นอย่างไร สำหรับมือใหม่ เริ่มต้นตั้งแต่ศูนย์

วิธีตั้ง Admin Permission ด้วย add_ace และ add_principal FiveM แบบละเอียด