FiveM MariaDB Field Doesn't Have a Default Value แก้อย่างไร? วิธีแก้ Error 1364 เมื่อ INSERT ไม่ส่งค่าที่ Column บังคับใช้
FiveM MariaDB Field doesn't have a default value คือ Error ที่เกิดเมื่อ Resource ทำ INSERT โดยไม่ได้ส่งค่ามาให้ Column ที่จำเป็นต้องมีค่า และ Column นั้นก็ไม่มี DEFAULT ที่ MariaDB สามารถนำมาใช้แทนได้
MariaDB กำหนด Error นี้เป็น:
Error 1364
SQLSTATE HY000
ER_NO_DEFAULT_FOR_FIELD
Field '...' doesn't have a default value
ตัวอย่างที่อาจพบใน FiveM Console:
Field 'identifier' doesn't have a default value
Field 'owner' doesn't have a default value
Field 'character_id' doesn't have a default value
Field 'status' doesn't have a default value
ปัญหานี้มักเกิดหลัง:
ติดตั้ง Script ใหม่
อัปเดต Resource แต่ไม่ทำ Migration
เปลี่ยน Framework
เพิ่ม Column ใหม่
Restore Database คนละ Version
แก้ Table ด้วยตัวเอง
INSERT ระบุ Columns ไม่ครบ
แนวทางตรวจที่ถูกต้องคือ:
Error 1364
↓
ดู Field ที่ Error
↓
SHOW CREATE TABLE
↓
ดูว่า NOT NULL หรือไม่
↓
มี DEFAULT หรือไม่
↓
ดู INSERT ของ Resource
↓
ดูว่าทำไม Column ถูกละออก
↓
ตรวจ Resource Version / Migration
↓
ตัดสินว่าต้องส่งค่าหรือควรมี Default
↓
แก้ Root Cause
① Error 1364 คืออะไร
MariaDB ระบุ Error 1364 ว่าเป็น ER_NO_DEFAULT_FOR_FIELD และใช้ข้อความ:
Field '%s' doesn't have a default value
ตัวอย่าง Table:
CREATE TABLE `players` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`identifier` VARCHAR(100) NOT NULL,
`name` VARCHAR(100) NOT NULL
);
แต่ Resource ทำ:
INSERT INTO `players`
(`name`)
VALUES
('John');
Query นี้ไม่ได้ระบุ:
identifier
ขณะที่ identifier:
NOT NULL
ไม่มี DEFAULT
MariaDB จึงไม่มีค่าที่สามารถใช้สร้าง Row นั้นได้ และสามารถคืน Error 1364 ได้.
② Error 1364 ต่างจาก Error 1048 อย่างไร
บทความก่อนหน้า:
1048
Column cannot be null
มักหมายถึง Resource ส่ง NULL เข้า Column โดยตรง ทั้งที่ Column ไม่รับ NULL
แต่:
1364
Field doesn't have a default value
มักเกิดเมื่อ INSERT ไม่ได้ส่งค่าของ Field นั้นมาเลย และ MariaDB หา Default สำหรับ Field ไม่ได้.
จำง่ายๆ:
1048
= ส่ง NULL
1364
= ไม่ส่ง Field และไม่มี Default
③ ตัวอย่างความแตกต่าง 1048 กับ 1364
Schema:
CREATE TABLE `characters` (
`identifier` VARCHAR(100) NOT NULL,
`name` VARCHAR(100) NOT NULL
);
กรณีนี้:
INSERT INTO `characters`
(`identifier`, `name`)
VALUES
(NULL, 'John');
คือการ Explicitly ส่ง:
identifier = NULL
จึงเกี่ยวกับ Column cannot be null
แต่:
INSERT INTO `characters`
(`name`)
VALUES
('John');
ไม่ได้ระบุ identifier เลย
ถ้า identifier ไม่มี Default ก็เข้ากับ Error 1364.
④ DEFAULT คืออะไร
DEFAULT คือค่าที่ MariaDB สามารถใช้ให้ Column เมื่อ INSERT ไม่ได้ระบุค่าของ Column นั้น ตาม Definition ที่กำหนดไว้ใน Schema.
ตัวอย่าง:
CREATE TABLE `characters` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`status` VARCHAR(20) NOT NULL DEFAULT 'active'
);
จากนั้น:
INSERT INTO `characters` ()
VALUES ();
Column:
status
สามารถใช้:
active
ตาม Default ที่กำหนด
⑤ Column ที่ไม่มี Default คืออะไร
ตัวอย่าง:
`identifier` VARCHAR(100) NOT NULL
ไม่มี:
DEFAULT ...
ดังนั้น Resource ต้องส่ง identifier ตาม Data Model
หาก Resource ละ Column นี้ออกจาก INSERT MariaDB ไม่มี Default สำหรับนำมาใช้ และ Error 1364 สามารถเกิดขึ้นได้.
⑥ FiveM เจอ Error 1364 จากอะไรบ่อยที่สุด
สาเหตุที่ควรตรวจ:
① INSERT ระบุ Columns ไม่ครบ
② Resource รุ่นใหม่กับ Schema รุ่นเก่า
③ Database รุ่นใหม่แต่ Resource เก่า
④ Migration เพิ่ม NOT NULL Column โดยไม่มี Default
⑤ Custom Script INSERT ตาม Schema เก่า
⑥ Framework เพิ่ม Required Field ใหม่
⑦ Admin ลบ DEFAULT ออกจาก Column
⑧ Restore Database ผิด Version
⑨ Seed/Migration Script ไม่ครบ
⑩ Resource สองตัวใช้ Table เดียวกันแต่คนละ Schema
⑦ ตัวอย่าง INSERT Columns ไม่ครบ
Schema:
CREATE TABLE `vehicles` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`owner` VARCHAR(100) NOT NULL,
`plate` VARCHAR(20) NOT NULL,
`model` VARCHAR(100) NOT NULL
);
Resource ทำ:
INSERT INTO `vehicles`
(`plate`, `model`)
VALUES
(?, ?);
ขาด:
owner
หาก owner ไม่มี Default:
Field 'owner' doesn't have a default value
สามารถเกิดขึ้นได้.
⑧ วิธีดู Table จริงก่อนแก้
ใช้:
SHOW CREATE TABLE `vehicles`;
MariaDB ระบุว่า SHOW CREATE TABLE แสดงคำสั่ง CREATE TABLE ที่ใช้สร้าง Table ปัจจุบัน รวม Column Definitions และ Indexes.
จากนั้นหา:
owner
ดูว่าเป็น:
`owner` VARCHAR(100) NOT NULL
หรือ:
`owner` VARCHAR(100) NOT NULL DEFAULT ''
หรือ:
`owner` VARCHAR(100) DEFAULT NULL
สามแบบนี้มี Semantics ต่างกัน
⑨ อย่าดู install.sql อย่างเดียว
Resource Folder อาจมี:
`owner` VARCHAR(100) DEFAULT NULL
แต่ Production Database จริงอาจเป็น:
`owner` VARCHAR(100) NOT NULL
หรือกลับกัน
ดังนั้นต้องตรวจ Database จริง:
SHOW CREATE TABLE `table_name`;
ก่อนแก้ Schema.
⑩ Resource Update แต่ Migration ไม่ครบ
สมมติ Resource v1 มี:
identifier
name
Resource v2 เพิ่ม:
account_id
และ Schema ใหม่กำหนด:
`account_id` INT NOT NULL
แต่ Custom Resource ตัวเก่ายัง INSERT:
INSERT INTO `characters`
(`identifier`, `name`)
VALUES
(?, ?);
ไม่ได้ส่ง:
account_id
ผลคือ Error 1364
นี่เป็น Pattern:
Schema ใหม่
+
INSERT เก่า
⑪ Database เก่ากับ Resource ใหม่ก็เกิดได้
อีกด้านหนึ่ง Resource ใหม่อาจคาดว่า Database มี:
DEFAULT
สำหรับ Field ใหม่
แต่ Production Schema เก่าไม่มี Default
Resource จึงละ Field ออกจาก INSERT เพราะคาดว่า Database จะเติมให้ แต่ Databaseจริงเติมไม่ได้
ดังนั้นต้องให้:
Resource Version
Database Migration Version
ตรงกัน
⑫ Error หลังเปลี่ยน Framework
Framework เดิมอาจมี Table:
users
และ Required Columns ชุดหนึ่ง
Framework ใหม่อาจใช้:
players
characters
และ Fields คนละชุด
Custom Resource ที่ยังใช้ INSERT โครงสร้างเดิมอาจเจอ:
Field doesn't have a default value
หลัง Migration
ไม่ควรแก้ด้วยการเพิ่ม Default ทุก Fieldทันที
ต้องปรับ Custom Resource ให้ใช้ Data Model ใหม่
⑬ NOT NULL กับ DEFAULT เป็นคนละเรื่อง
Column:
`status` VARCHAR(20) NOT NULL DEFAULT 'active'
หมายถึง:
NULL
ไม่อนุญาต
แต่ถ้าไม่ส่ง Field
Databaseมี Default
ขณะที่:
`identifier` VARCHAR(100) NOT NULL
หมายถึง:
NULL
ไม่อนุญาต
และ
ไม่มี Default ที่กำหนด
ดังนั้น INSERT ต้องส่งค่าที่เหมาะสมให้ Field นี้
⑭ NULLABLE Column มีพฤติกรรมต่างกัน
MariaDB ระบุว่า NULL หมายถึง Missing/Unknown Value และ Column สามารถกำหนดให้รับหรือไม่รับ NULL ได้ด้วย NULL / NOT NULL.
ถ้า Column เป็น:
`note` TEXT NULL
แล้ว INSERT ไม่ระบุ note
Databaseสามารถใช้ NULL ได้ตาม Schema ในกรณีทั่วไป.
⑮ อย่าเปลี่ยน Required Field เป็น NULL เพียงเพื่อแก้ 1364
ตัวอย่าง:
identifier
owner
character_id
account_id
อาจเป็นข้อมูลที่ระบบต้องมีจริง
ถ้าแก้:
ALTER TABLE ...
MODIFY COLUMN `owner`
VARCHAR(100) NULL;
Error อาจหาย
แต่คุณอาจสร้าง:
Vehicle ไม่มี Owner
Character ไม่มี Account
Record ผูก Player ไม่ได้
ในภายหลัง
MariaDB รองรับการเพิ่มหรือลบ NOT NULL Constraint ผ่าน ALTER TABLE ... MODIFY COLUMN แต่การเปลี่ยนดังกล่าวควรเป็นการออกแบบ Schema ไม่ใช่การปิด Error แบบสุ่ม.
⑯ DEFAULT '' ไม่ใช่คำตอบสำหรับทุก String
ตัวอย่างที่ไม่ควรทำโดยไม่มีเหตุผล:
`owner`
VARCHAR(100)
NOT NULL
DEFAULT ''
เพียงเพราะ Resourceไม่ได้ส่ง Owner
Database จะสามารถสร้าง:
owner = ''
แต่ Business Data อาจเสีย
หาก Owner เป็น Required Relationship Resourceควรหา Owner ให้ได้ก่อน INSERT
⑰ DEFAULT 0 ก็ไม่ใช่คำตอบสำหรับทุก Integer
สมมติ:
character_id
ต้องอ้าง Character จริง
ถ้าตั้ง:
DEFAULT 0
คุณอาจเปลี่ยนจาก:
Error 1364
เป็น:
character_id = 0
ซึ่งอาจนำไปสู่:
Foreign Key Error
Record หา Character ไม่เจอ
ข้อมูลกำพร้า
Default ต้องเป็นค่าที่มีความหมายใน Domain จริง
⑱ Default เหมาะกับ Field แบบไหน
ตัวอย่างที่มักมีเหตุผล:
status = active
enabled = 1
retry_count = 0
created flag = 0
หาก Data Model กำหนดเช่นนั้น
เช่น:
`status`
VARCHAR(20)
NOT NULL
DEFAULT 'active'
เมื่อ Applicationไม่ระบุ Status Databaseสามารถใช้ Default ที่ถูกออกแบบไว้.
⑲ Default ไม่เหมาะกับ Field แบบไหน
Fields ที่ควรมีค่าจริงเฉพาะแต่ละ Entity เช่น:
identifier
license
owner
character_id
account_id
email-like identifier
plate ที่ต้อง Unique
ไม่ควรใส่ Fake Default:
unknown
0
none
''
เพียงเพื่อให้ INSERT ผ่าน
⑳ AUTO_INCREMENT เป็นกรณีพิเศษ
ถ้า Table มี:
`id` INT AUTO_INCREMENT PRIMARY KEY
Application โดยทั่วไปสามารถละ id ออกจาก INSERT และ MariaDB จะสร้างค่า Auto-increment ให้เอง.
ตัวอย่าง:
INSERT INTO `characters`
(`identifier`, `name`)
VALUES
(?, ?);
ไม่จำเป็นต้องส่ง:
id
หาก id ถูกออกแบบเป็น AUTO_INCREMENT
㉑ อย่าใส่ DEFAULT ให้ AUTO_INCREMENT แบบไม่จำเป็น
ถ้า ID ถูก Databaseสร้างอยู่แล้ว ให้ใช้ Auto-increment Mechanism ตาม Schema
oxmysql MySQL.insert จะคืน Insert ID เมื่อมีค่าที่ใช้ได้หลัง Insert.
ตัวอย่าง:
local characterId = MySQL.insert.await([[
INSERT INTO `characters`
(`identifier`, `name`)
VALUES
(?, ?)
]], {
identifier,
name
})
นี่เหมาะกว่าการสร้าง ID แบบ Manual หาก Schemaถูกออกแบบให้ Auto-increment
㉒ วิธีตรวจว่า Field มี Default หรือไม่
ใช้:
SHOW CREATE TABLE `characters`;
แล้วดู:
`status`
varchar(20)
NOT NULL
DEFAULT 'active'
หรือใช้:
SHOW COLUMNS FROM `characters`;
เพื่อดูข้อมูล Column
แต่ SHOW CREATE TABLE มักช่วยให้เห็น Definition โดยรวมชัดที่สุด.
㉓ Explicit DEFAULT ใช้ได้ไหม
MariaDB รองรับ DEFAULT Keyword เพื่อใช้ค่าที่กำหนดไว้เป็น Default ของ Column.
ตัวอย่าง:
INSERT INTO `players`
(
`identifier`,
`status`
)
VALUES
(
?,
DEFAULT
);
ถ้า status มี Default:
active
ก็ใช้ค่านั้น
㉔ แต่ DEFAULT ใช้ไม่ได้ถ้าไม่มี Default
MariaDB Documentation ยกตัวอย่างตรงว่า หากใช้ DEFAULT กับ Column ที่ไม่มี Default จะเกิด:
ERROR 1364
Field 'col' doesn't have a default value
ดังนั้นการเปลี่ยน Query จาก:
ไม่ส่ง Column
เป็น:
DEFAULT
ไม่ได้แก้ หาก Schema ไม่มี Default อยู่ดี
㉕ DEFAULT() Function
MariaDB มี DEFAULT() สำหรับดึง Default Value ของ Column และหาก Column ไม่มี Default และไม่ได้เป็น Nullable Database สามารถคืน Error 1364 ได้.
นี่ช่วยยืนยันว่า Error 1364เกี่ยวข้องโดยตรงกับการไม่มี Default ที่ใช้งานได้
㉖ Error 1364 หลังเพิ่ม Column ใหม่
สมมติ Admin ทำ:
ALTER TABLE `characters`
ADD COLUMN `server_id` INT NOT NULL;
Existing/Old Resourceยังไม่รู้จัก server_id
การเพิ่ม Required Column โดยไม่มี Strategy เรื่อง Default หรือ Migration สามารถทำให้ INSERT เก่าที่ไม่ส่ง Field ใหม่เริ่มล้มเหลว
MariaDB Documentation ระบุว่าเมื่อเพิ่ม NOT NULL Column ในบาง DDL Context ต้องมี Default ที่ใช้ได้ หรือ Schemaต้องจัดการอย่างเหมาะสม.
㉗ วิธีเพิ่ม Required Column ที่ปลอดภัยกว่า
ขึ้นกับ Migration Design
ตัวอย่าง Workflow:
① Backup
② เพิ่ม Column แบบเหมาะกับ Existing Data
③ Populate Existing Rows
④ Update Resource ให้ส่งค่าใหม่
⑤ เพิ่ม Constraint/Default ตาม Final Schema
⑥ Verify
ไม่ควร:
ALTER Production
↓
เพิ่ม NOT NULL Required Field
↓
Restart FiveM
↓
หวังว่า Resources เก่าจะรู้จัก Field ใหม่
㉘ Existing Rows ต้องคิดด้วย
ถ้า Table มี:
1,000,000 Rows
แล้วเพิ่ม Required Column ใหม่
ต้องตอบว่า Existing Rows จะได้ค่าอะไร
เช่น:
server_id
ไม่ควรถูกตั้ง:
0
โดยอัตโนมัติถ้า 0 ไม่มีความหมาย
Migration ต้องมี Data Backfill Strategy
㉙ ALTER DEFAULT ทำได้ไหม
MariaDB ALTER TABLE รองรับการเปลี่ยนโครงสร้าง Table รวมถึงการจัดการ Default ของ Column.
ตัวอย่างแนวคิด:
ALTER TABLE `characters`
ALTER COLUMN `status`
SET DEFAULT 'active';
แต่ Syntax/Definition ที่ใช้จริงควรตรวจให้ตรง MariaDB Version และ Schema ปัจจุบัน
ก่อนเปลี่ยน Production ควร Backup และดู SHOW CREATE TABLE ก่อน
㉚ อย่าเพิ่ม DEFAULT โดยไม่รู้ Business Rule
ถ้า Error:
Field 'job' doesn't have a default value
อย่ารีบ:
DEFAULT 'unemployed'
เพียงเพราะดูสมเหตุสมผล
Official Framework อาจใช้:
job JSON
job_id
job grade
หรือมี Initialization Logic ของตัวเอง
Default ที่คุณเพิ่มเองอาจขัดกับ Framework
㉛ Error หลังติดตั้ง Custom Script
Custom Script อาจเขียน:
INSERT INTO `users`
(
`identifier`
)
VALUES
(
?
);
แต่ Framework Table จริงมี Required Fields เพิ่ม:
firstname
lastname
dateofbirth
sex
height
ไม่มี Defaults
ผลคือ INSERT แบบ Custom อาจเกิด Error 1364
แนวทางที่ถูกต้องคือใช้ Framework API/Data Creation Flow ที่เหมาะสม หรือ Insert Required Fields ครบตาม Schema
㉜ อย่าให้ Script ภายนอกสร้าง Framework Player Row แบบครึ่งชุด
ถ้า Framework มี Player Creation Logic ของตัวเอง ควรพิจารณาใช้ Logic/API นั้นแทนเขียน Raw INSERT ที่สร้าง Rowไม่ครบ
เพราะ Framework Update สามารถเพิ่ม:
Required Column
Default Logic
Additional Tables
Transaction
ในอนาคต
Raw INSERT เก่าอาจพังทันทีเมื่อ Schema เปลี่ยน
㉝ Parameter ไม่ได้ช่วยถ้า Column หายจาก INSERT
สมมติ:
MySQL.insert.await(
'INSERT INTO `characters` (`name`) VALUES (?)',
{
name
}
)
ต่อให้ Parameter name ถูกต้อง 100%
หาก Table ยังมี:
identifier NOT NULL
ไม่มี Default
ก็ยังเกิด Error 1364 ได้
เพราะปัญหาไม่ใช่ Parameter ของ name
ปัญหาคือ:
INSERT ไม่ได้พูดถึง identifier เลย
㉞ วิธีแก้ Query ที่ขาด Field
ถ้า identifier เป็น Required Value จริง:
MySQL.insert.await([[
INSERT INTO `characters`
(`identifier`, `name`)
VALUES
(?, ?)
]], {
identifier,
name
})
จากนั้นต้อง Validate ก่อน:
if not identifier then
return
end
เพื่อไม่ให้เปลี่ยนจาก Error 1364 ไปเป็น Error 1048
㉟ แก้ 1364 แล้วเจอ 1048 หมายความว่าอย่างไร
ตัวอย่างเดิม:
ไม่ส่ง identifier
→ 1364
Developerแก้ Queryให้ส่ง:
identifier
แต่ Variable เป็น:
nil
ตอนนี้จะกลายเป็น:
1048
Column 'identifier' cannot be null
นี่ไม่ใช่ Databaseแย่ลง
แต่เป็นการ Debug ที่ลึกขึ้น:
ขั้นแรก
Column ถูกละ
ขั้นสอง
พบว่าค่าของ Column หายจริง
ต้องตาม Resource Logic ต่อ
㊱ Error 1364 กับ 1048 จึงมักเจอคู่กัน
Flow:
INSERT ไม่ส่ง Field
↓
1364
เพิ่ม Field เข้า INSERT
↓
ค่าเป็น nil
↓
1048
ดังนั้นการแก้ Error 1364 ที่ดีต้องตรวจด้วยว่า:
Value ที่จะเพิ่มเข้ามา
มีจริงหรือไม่
ไม่ใช่เพียงแก้ SQL Column List
㊲ Error 1364 กับ 1366 ต่างกัน
1364
Field ไม่มี Default
คือไม่มีค่าที่ใช้สำหรับ Field
แต่:
1366
Incorrect Value
หมายถึงมีค่ามาแล้ว แต่ค่าชนิดนั้นไม่ถูกต้องสำหรับ Column
ตัวอย่าง:
1364
level ไม่ถูกส่ง
กับ:
1366
level = "hello"
เป็นคนละปัญหา
㊳ Error 1364 กับ 1062 ต่างกัน
1364
Required Field ไม่มีค่า/Default
แต่:
1062
Duplicate Entry
คือ Key ที่ต้อง Unique ได้รับค่าซ้ำ
อย่าใช้ Upsert เพื่อแก้ Field Missing เว้นแต่ Business Logic อื่นของ Query ต้องการ Upsertจริง
㊴ Error 1364 กับ Foreign Key Error
1364
character_id ไม่ถูกส่ง
ส่วน:
1452
character_id ถูกส่ง
แต่ Parent Character ไม่มี
ดังนั้นการเติม:
DEFAULT 0
ให้ Character ID อาจเปลี่ยน Error 1364 เป็น Foreign Key Errorแทน
ไม่ใช่ Root-cause Fix
㊵ SQL_MODE มีผลไหม
MariaDB ใช้ SQL_MODE เพื่อกำหนดความเข้มงวดและ Compatibility Behavior ของ Server และ Strict Mode เป็น Default ใน MariaDB รุ่นสมัยใหม่ตาม Documentation ปัจจุบัน.
เมื่อ Strict Mode ทำงาน Statements ที่ขาด Required Values มีแนวโน้มถูกปฏิเสธแทนการใช้ Dummy/Adjusted Values แบบพฤติกรรมเก่าบางรุ่น.
㊶ อย่าปิด Strict Mode เพื่อแก้ 1364
สมมติ Schemaต้องการ:
identifier
แต่ Resourceไม่ส่ง
การลด Strictness ไม่ได้สร้าง Identifier ที่ถูกต้องขึ้นมา
มันอาจเปลี่ยน Error Handling แต่ Data Contract ยังคงผิด
วิธีที่ถูกคือ:
ส่งค่าที่ Field ต้องการ
หรือ
ออกแบบ Default/Nullable อย่างมีเหตุผล
㊷ วิธีดู SQL_MODE
ใช้:
SELECT @@sql_mode;
MariaDB Documentation ระบุว่าสามารถตรวจ Session/Global SQL Mode เพื่อดู Behavior ที่กำลังใช้งานได้.
มีประโยชน์เมื่อ:
Server เก่าไม่ Error
Server ใหม่ Error 1364
หลังย้าย VPS
㊸ Error หลังย้าย VPS
ตรวจ:
MariaDB Version
SQL_MODE
SHOW CREATE TABLE
Resource Version
Migration Version
เปรียบเทียบเครื่องเก่ากับใหม่
อย่าสรุปว่า VPS ใหม่เสีย เพราะ Database Connectionอาจทำงานสมบูรณ์และ Error เพียงแค่เปิดเผย Schema/Strictness Difference
㊹ Error หลัง Restore Backup
สมมติ Restore:
Database Backup เก่า
แต่ใช้:
Resources ใหม่
หรือกลับกัน
Required Fields/Defaults อาจไม่ตรงกัน
ตรวจ:
SHOW CREATE TABLE `table_name`;
แล้วเทียบกับ Migration ของ Resource Version ปัจจุบัน
㊺ Error หลัง Import install.sql ซ้ำ
ถ้า Admin แก้ Table บางส่วนด้วย SQL จาก Resource Version คนละรุ่น อาจเกิด Mixed Schema เช่น:
Column A = v1
Column B = v3
Indexes = v2
Defaults = Custom
Server จึงเริ่มเกิด Errors หลายแบบต่อเนื่อง
วิธีที่ดีกว่าคือทำ Schema Diff กับ Official Version ที่ติดตั้ง ไม่ใช่ Import SQL Files ซ้ำแบบสุ่ม
㊻ mysql_debug ช่วยอะไร
oxmysql มี Debug Information สำหรับดู Queries ที่ Resources Execute และ Query Timing สามารถดูผ่าน Server Console/Debug UI เมื่อเปิด mysql_debug.
เมื่อเจอ 1364 เป้าหมายคือหา:
Resource
↓
INSERT Statement
↓
Column List
↓
Field ที่ขาด
ต่างจาก Error 1048 ที่ต้องเน้นค่าของ Parameter ที่เป็น NULL
㊼ จุดสำคัญคือดู SQL Column List
สมมติ Error:
Field 'owner' doesn't have a default value
Query:
INSERT INTO `vehicles`
(
`plate`,
`model`
)
VALUES
(
?,
?
);
มองเพียง Query ก็เห็นว่า:
owner
หายจาก Column List
ไม่จำเป็นต้องเริ่มจาก Restart MariaDB
㊽ Query ผ่าน phpMyAdmin แต่ FiveM Error?
ต้องเปรียบเทียบ Queryจริง
บางครั้งตอน Admin Test เขียน:
INSERT INTO `vehicles`
(
`owner`,
`plate`,
`model`
)
VALUES
(
'license:abc',
'ABC123',
'adder'
);
จึงผ่าน
แต่ Resource ส่ง:
INSERT INTO `vehicles`
(
`plate`,
`model`
)
VALUES
(
?,
?
);
จึง Error
ปัญหาอยู่ที่ Query ของ Resource ไม่ใช่ Database Table โดยตรง
㊾ MySQL.insert ใช้ตรวจ Insert ID ได้
oxmysql MySQL.insert เพิ่ม Record และคืน Insert ID ของ Row เมื่อมีค่าที่ใช้ได้.
ตัวอย่าง:
local id = MySQL.insert.await([[
INSERT INTO `characters`
(`identifier`, `name`, `status`)
VALUES
(?, ?, ?)
]], {
identifier,
name,
status
})
ก่อนใช้ id ต่อควรตรวจว่า Insert สำเร็จตาม Logic ของ Resource
㊿ Transaction ช่วยได้ไหม
ถ้า FiveM Workflow ต้องทำ:
Create Character
Create Inventory
Create Settings
พร้อมกัน MySQL.transaction สามารถช่วยให้ Queries ถูก Commit เมื่อทั้งหมดสำเร็จ และหากหนึ่ง Query Fail จะไม่ Commit Queries ในชุดนั้น.
เช่นหาก Settings Insert เกิด Error 1364 Transactionช่วยป้องกัน Character ถูกสร้างเพียงครึ่งระบบ
แต่ Transaction ไม่แก้ Required Field ที่หาย
51. Transaction ไม่สร้าง DEFAULT ให้
ถ้า Query:
INSERT INTO `settings`
(
`character_id`
)
VALUES
(
?
);
แต่ Table มี:
theme NOT NULL
ไม่มี DEFAULT
Transaction ไม่ได้เปลี่ยน Schema
Query ยังคง Fail
ต้อง:
ส่ง theme
หรือกำหนด Default หาก Business Rule ต้องการจริง
52. Resource Initialization ต้องมี Required Data
ก่อน INSERT ควรสร้าง Data Object ที่สมบูรณ์ เช่น:
local character = {
identifier = identifier,
name = name,
status = 'active'
}
if not character.identifier then
return
end
if not character.name then
return
end
จากนั้นจึงทำ INSERT
ช่วยป้องกันทั้ง:
1364
1048
1366
ในหลาย Flow
53. Config Missing ก็ทำให้ Schema Flow ผิดได้
บาง Resource สร้าง Dynamic Query:
local columns = Config.SaveColumns
ถ้า Config รุ่นเก่าไม่มี Field ใหม่:
server_id
SQL ที่สร้างขึ้นอาจละ Required Field โดยไม่ตั้งใจ
ดังนั้น Error 1364 ไม่ได้เกิดจาก Static SQL อย่างเดียว
54. Dynamic INSERT ต้องระวังมากขึ้น
เช่น Resourceสร้าง:
Columns จาก Table
Values จาก Lua Object
แบบ Dynamic
ต้องตรวจว่า Required Fields ครบก่อน Generate Query
ไม่ควรใช้ Database Error เป็นตัวตรวจว่า Object มี Fields ครบหรือไม่ทุกครั้ง
55. Schema Migration ที่ดีควรคิดถึง Backward Compatibility
หากกำลังเพิ่ม Required Field ใหม่ใน Resource ที่มี Serverใช้งานอยู่จำนวนมาก ควรวาง Migration ให้:
Existing Rows
Old Code
New Code
ผ่านการเปลี่ยน Version อย่างเป็นขั้นตอน
นี่เป็นเรื่องของ Resource Design มากกว่าการแก้ SQL Errorเฉพาะหน้า
56. วิธีแก้ Error 1364 แบบ 5 นาที
เมื่อ Console ขึ้น:
Field 'owner' doesn't have a default value
ทำตามนี้:
ยืนยัน Error Code
1364จด Table
จด Field
SHOW CREATE TABLEดูว่า Field เป็น
NOT NULLหรือไม่ดูว่า Field มี
DEFAULTหรือไม่Copy INSERT Query จาก Resource
ดูว่า Field อยู่ใน Column List หรือไม่
ถ้าไม่มี ให้หาว่าทำไม
ถ้าต้องส่ง ให้เพิ่ม Value ที่ถูกต้อง
ถ้าควรมี Default ให้ตรวจ Official Schema
ตรวจ Migration
ตรวจ Resource Version
ตรวจ SQL_MODE
ทดสอบ Flow เดิม
57. ตัวอย่าง Debug จริง
Error:
Field 'status' doesn't have a default value
Schema:
`status` VARCHAR(20) NOT NULL
Query:
INSERT INTO `characters`
(
`identifier`,
`name`
)
VALUES
(
?,
?
);
ถ้า Official Schema ของ Resource ระบุว่า:
status ต้องถูกกำหนดตอน Character Create
ก็แก้ Query:
INSERT INTO `characters`
(
`identifier`,
`name`,
`status`
)
VALUES
(
?,
?,
?
);
และส่ง:
active
จาก Resource Logic
58. อีกตัวอย่าง: Schema ควรมี Default
สมมติ Official Resource ออกแบบ:
`status`
VARCHAR(20)
NOT NULL
DEFAULT 'active'
แต่ Production จริง:
`status`
VARCHAR(20)
NOT NULL
กรณีนี้ Query อาจไม่ได้ผิด
Root Cause อาจเป็น:
Migration Schema ไม่ครบ
ให้แก้ Schema ตาม Official Migration ไม่ใช่แก้ Resourceทุกตัวให้ส่ง Statusเอง
59. อีกตัวอย่าง: Field ไม่ควรมี Default
Error:
Field 'identifier' doesn't have a default value
Schema:
identifier VARCHAR(100) NOT NULL
กรณีนี้:
DEFAULT ''
อาจเป็นวิธีแก้ที่ผิด
เพราะ Character ทุกตัวควรผูก Identifier จริง
ควรแก้ Resource ให้ส่ง Player Identifier ที่ถูกต้อง
60. Checklist Error 1364 สำหรับ FiveM
ตรวจทั้งหมดนี้:
Error เป็น 1364 จริงหรือไม่
SQLSTATE เป็น HY000 หรือไม่
Table ไหน
Field ไหน
Field เป็น NOT NULL หรือไม่
Field Nullable หรือไม่
Field มี DEFAULT หรือไม่
Default มีความหมายจริงหรือไม่
Field เป็น AUTO_INCREMENT หรือไม่
Field อยู่ใน INSERT Column List หรือไม่
Resource ไหนยิง INSERT
Query มาจาก Static SQL หรือ Dynamic SQL
Config สร้าง Column List หรือไม่
Custom Script เก่าหรือไม่
Resource Version ล่าสุดของ Serverคืออะไร
Schema Version ตรงหรือไม่
Migration SQL ครบหรือไม่
Framework Version เปลี่ยนหรือไม่
Required Field ใหม่ถูกเพิ่มหรือไม่
Backup Restore มาจาก Version ไหน
SQL_MODE เครื่องใหม่ต่างหรือไม่
Strict Mode เปิดหรือไม่
Admin เคย ALTER Table เองหรือไม่
Default ถูกลบหรือไม่
Field ควรใช้ Defaultจริงหรือไม่
Field ควร Nullableจริงหรือไม่
มี Related Tables หรือไม่
Foreign Key เกี่ยวข้องหรือไม่
เพิ่ม Fieldเข้า Queryแล้ว Value มีจริงหรือไม่
จะกลายเป็น Error 1048 หรือไม่
Transactionเหมาะหรือไม่
Backup ก่อน Schema Change แล้วหรือไม่
Test Player ใหม่แล้วหรือไม่
Test Existing Player แล้วหรือไม่
Test Resource Restart แล้วหรือไม่
ตาราง Error ที่มักสับสน
| Error | ความหมายหลัก |
|---|---|
1048 | ส่ง NULL ลง Column ที่ห้าม NULL |
1054 | Unknown Column |
1062 | Duplicate Entry |
1264 | Out of Range |
1265 | Data Truncated |
1292 | Truncated Incorrect Value |
1364 | Field ไม่มี Default |
1366 | Incorrect Value for Column |
1406 | Data Too Long |
1452 | Foreign Key Constraint Fail |
MariaDB ระบุ Error 1364 โดยตรงว่าเป็น ER_NO_DEFAULT_FOR_FIELD.
FiveM Field Doesn't Have a Default Value แก้อย่างไร
เริ่มจาก:
SHOW CREATE TABLE `table_name`;
แล้วตรวจ Field ที่ Error
จากนั้นดู:
NOT NULL?
DEFAULT?
AUTO_INCREMENT?
MariaDB ระบุว่าเมื่อ INSERT ละ Column ออก Databaseจะใช้ Default หรือ NULL หาก Column อนุญาต; Required Column ที่ไม่มีค่าที่ใช้ได้จึงต้องถูกจัดการให้ถูกต้อง.
FiveM Error 1364 คืออะไร
คือ:
ER_NO_DEFAULT_FOR_FIELD
พร้อมข้อความ:
Field '...' doesn't have a default value
FiveM Error 1364 กับ 1048 ต่างกันอย่างไร
จำง่ายที่สุด:
1364
ไม่ได้ส่ง Field
1048
ส่ง Field แต่ค่าเป็น NULL
Root Cause สามารถเชื่อมกันได้ เช่นเพิ่ม Field เข้า Queryเพื่อแก้ 1364 แล้วพบว่า Variable เป็น nil จึงกลายเป็น 1048.
FiveM Required Field ไม่มี Default ต้องทำอย่างไร
ถ้า Field เป็น Required Data จริง:
ส่งค่าที่ถูกต้อง
ถ้า Fieldควรมี Defaultตาม Official Data Model:
Migration Schema ให้มี Default
ถ้า Field Optional จริง:
พิจารณา Nullable
อย่าเลือกจากวิธีที่ทำให้ Error หายเร็วที่สุด
เลือกจาก Data Model
FiveM เพิ่ม DEFAULT ยังไง
MariaDB รองรับการจัดการ Defaults ผ่าน Schema Definition และ ALTER TABLE.
ตัวอย่างเชิงแนวคิด:
ALTER TABLE `characters`
ALTER COLUMN `status`
SET DEFAULT 'active';
ควรใช้เฉพาะเมื่อ Default นี้ตรงกับ Resource Schema/Business Rule จริง
FiveM ลบ DEFAULT ได้ไหม
MariaDB รองรับการแก้หรือลบ Default ของ Column ผ่าน Table Alteration.
แต่ถ้า Resources บางตัวอาศัย Default อยู่ การลบออกสามารถทำให้ INSERT เดิมเริ่มเกิด Error 1364
จึงต้องตรวจ Dependency ก่อน
FiveM ใช้ DEFAULT keyword ได้ไหม
ได้ถ้า Column มี Default ที่ใช้งานได้:
INSERT INTO `characters`
(
`identifier`,
`status`
)
VALUES
(
?,
DEFAULT
);
MariaDB รองรับ DEFAULT ใน INSERT แต่ถ้า Field ไม่มี Default ก็สามารถเกิด Error 1364 ได้.
FiveM AUTO_INCREMENT ต้องส่ง ID ไหม
โดยทั่วไปไม่ต้อง หาก Schemaออกแบบ:
id INT AUTO_INCREMENT
MariaDB สามารถสร้าง ID ให้อัตโนมัติเมื่อ Insert Row.
oxmysql MySQL.insert สามารถคืน Insert ID หลัง Insertสำเร็จ.
FiveM Error 1364 หลัง Update Script แก้อย่างไร
ตรวจ:
Resource Version
↓
Migration SQL
↓
SHOW CREATE TABLE
↓
INSERT Query
หาก Resourceใหม่เพิ่ม Required Field ต้องดูว่า Official Migration กำหนด Default หรือให้ Resourceส่งค่ามา
ไม่ควรสร้าง Defaultเองจากการเดา
FiveM Error 1364 หลังย้าย VPS แก้อย่างไร
ตรวจ:
SELECT @@sql_mode;
พร้อมเปรียบเทียบ Schema:
SHOW CREATE TABLE `table_name`;
Strict SQL Mode และ Schema Differences สามารถทำให้ Serverใหม่แสดง Error ที่เครื่องเก่าเคยจัดการต่างออกไป.
FiveM Error 1364 หลัง Restore Database แก้อย่างไร
ตรวจว่า Backup และ Resource Files เป็น Version เดียวกันหรือไม่
หาก Restore Schema เก่าแล้วใช้ Resourceใหม่:
Required Fields
Defaults
Columns
อาจไม่ตรงกัน
ใช้ Migration ตามลำดับ Version ก่อน Production
FiveM Error 1364 เกิดจาก oxmysql ไหม
Error 1364 เป็น Error ที่ MariaDB คืนจาก Schema/INSERT Semantics ส่วน oxmysql เป็น Database Layer ที่ Resource ใช้ Execute Query
จึงควรตรวจ:
SQL Column List
+
Current Schema
ก่อนสรุปว่า oxmysql มีปัญหา
FiveM mysql_debug ช่วยได้ไหม
ได้ โดย oxmysql ระบุว่า Query Debug/Timing สามารถดูใน Server Console เมื่อเปิด mysql_debug.
สำหรับ Error 1364 ให้ใช้เพื่อจับ Query ที่ Resource ส่ง แล้วดูว่า Required Field หายจาก INSERT หรือไม่
FiveM Transaction ช่วย Error 1364 ได้ไหม
Transaction ไม่สร้าง Default ให้ Field แต่ช่วยให้ Multi-query Workflow ไม่ถูก Commitครึ่งชุดเมื่อ Query หนึ่งล้มเหลว
oxmysql ระบุว่า Transaction Commit เมื่อ Queries ทั้งหมดสำเร็จ และหากหนึ่ง Query Fail จะไม่มี Queries ในชุดถูก Commit.
FAQ FiveM MariaDB Error 1364
Error 1364 คืออะไร?
คือ MariaDB ER_NO_DEFAULT_FOR_FIELD หรือ Field doesn't have a default value.
เกิดเพราะอะไร?
มักเกิดเมื่อ INSERT ไม่ระบุ Required Column และ Columnนั้นไม่มี Default ที่ใช้แทนได้.
Error 1364 กับ 1048 เหมือนกันไหม?
ไม่ 1048 เกี่ยวกับ NULL ส่วน 1364 เกี่ยวกับการไม่มี Default/Required Value
DEFAULT คืออะไร?
คือค่าที่ Column ใช้เมื่อ INSERT ไม่ได้ระบุค่าให้ตาม Definition ที่กำหนด.
ทุก Column ควรมี DEFAULT ไหม?
ไม่ Required Identity/Relationship Fields หลายชนิดควรบังคับให้ Applicationส่งค่าจริง
Default '' ดีไหม?
เหมาะเฉพาะเมื่อ Empty String มีความหมายจริงใน Data Model ไม่ควรใช้กับ Owner/Identifier เพียงเพื่อปิด Error
Default 0 ดีไหม?
ใช้เมื่อ Zero เป็นค่าที่ถูกต้องจริง ไม่ควรใช้แทน Missing Character/Account ID แบบสุ่ม
AUTO_INCREMENT ต้องมี Default ไหม?
Auto-increment มี Mechanismสร้างค่าถัดไปเองเมื่อ Insertตาม Schema จึงมักละ Columnนั้นออกจาก INSERTได้.
DEFAULT keyword ใช้ได้ไหม?
ได้ แต่ Columnต้องมี Default ที่ใช้ได้ มิฉะนั้น Error 1364 สามารถเกิดขึ้นได้.
เปลี่ยน NOT NULL เป็น NULL ได้ไหม?
ทำได้ด้วย Schema Alteration แต่ควรทำเฉพาะ Field ที่ Optional จริง.
Error หลัง Update Script หมายถึง Migration ไม่ครบไหม?
เป็นสาเหตุหนึ่งที่ควรตรวจ โดยเฉพาะเมื่อ Required Columns หรือ Defaults เปลี่ยนหลัง Resource Update
Error หลังย้าย VPS เกิดจาก SQL_MODE ได้ไหม?
ได้ในแง่ Behavior ของ Strictness จึงควรเปรียบเทียบ @@sql_mode และ Schema ระหว่างเครื่อง.
Transaction แก้ 1364 ได้ไหม?
ไม่แก้ Missing Default แต่ช่วย Rollback Multi-query Workflow เมื่อหนึ่ง Queryล้มเหลว.
ประเด็นสำคัญ
เมื่อ FiveM ขึ้น:
ERROR 1364
Field '...' doesn't have a default value
อย่าเริ่มจาก:
DEFAULT ''
DEFAULT 0
เปลี่ยนเป็น NULL
ปิด Strict Mode
ทันที
ให้ตรวจ:
1364
↓
Field ไหน
↓
SHOW CREATE TABLE
↓
NOT NULL?
↓
DEFAULT?
↓
INSERT Query ส่ง Field นี้หรือไม่
↓
Resource Version ตรง Schema ไหม
↓
Migration ครบไหม
↓
Field นี้ควรมี Default จริงหรือควรส่งค่าจริง
MariaDB ระบุว่า Error 1364 คือกรณี Field doesn't have a default value และเมื่อ INSERTละ Column ออก ระบบจะใช้ Default หรือ NULL ตาม Definition ที่อนุญาต; หากไม่มีค่าที่ใช้ได้ Required Field ก็ไม่สามารถถูกเติมให้เองได้.
สำหรับ FiveM จุดที่ต้องระวังมากที่สุดคือการใส่ Fake Default ให้ Fields สำคัญอย่าง identifier, owner หรือ character_id เพราะแม้ Query จะผ่าน แต่ข้อมูลที่ไม่มีเจ้าของหรือไม่ผูก Entityจริงอาจสร้างปัญหาที่แก้ยากกว่า Error 1364 เดิม
สำหรับผู้อ่าน comsiam ให้จำสูตร “1364 = ดูว่า INSERT ลืม Field หรือ Schema ลืม Default” และ comsiam แนะนำให้ตรวจ SHOW CREATE TABLE เทียบกับ SQL ของ Resource ทุกครั้งก่อน ALTER Database เพราะคำตอบที่ถูกอาจเป็นได้ทั้ง “เพิ่ม Field เข้า INSERT” หรือ “Migration Default ที่หาย” ซึ่งเป็นคนละปัญหากันโดยสิ้นเชิง
Comments
Post a Comment