mysql error 1364 Field tidak memiliki nilai default

113

Meja saya terlihat seperti

create table try ( name varchar(8), CREATED_BY varchar(40) not null);

lalu saya memiliki pemicu untuk mengisi bidang CREATED_BY secara otomatis

create trigger autoPopulateAtInsert BEFORE INSERT on try for each row set new.CREATED_BY=user();

Ketika saya melakukan penyisipan menggunakan

insert into try (name) values ('abc');

entri dibuat di tabel tetapi saya masih mendapatkan pesan kesalahan

Field 'CREATED_BY' doesn't have a default value Error no 1364

Apakah ada cara untuk menekan kesalahan ini tanpa membuat bidang menjadi nullable DAN tanpa menghapus triggfer? Jika tidak, hibernasi saya akan melihat pengecualian ini (meskipun penyisipan telah dibuat) dan kemudian aplikasi akan macet.

kk1957
sumber

Jawaban:

28

Tetapkan nilai default untuk Created_By(misalnya: kosong VARCHAR) dan pemicu akan memperbarui nilainya.

create table try ( 
     name varchar(8), 
     CREATED_BY varchar(40) DEFAULT '' not null
);
KinSlayerUY
sumber
Bagaimana cara mengatur nilai default dalam program Java?
Nagarajan Shanmuganathan
1
Anda memerlukan nilai default dalam definisi tabel (buat tabel coba (nama varchar (8), CREATED_BY varchar (40) DEFAULT '' bukan null))
KinSlayerUY
Ini tidak mengatasi masalah root. Lihat jawaban yang jauh lebih luas dari Phyxx di bawah ini.
csvan
3
Jawaban @csvan Phyxx tidak mengatasi akar masalah karena akar penyebabnya adalah bug di MySQL yang telah diperbaiki di v5.7.1 - lihat jawabannya oleh B98: stackoverflow.com/a/29854279/5389997 Menghapus mode sql strict_trans_table membuat MySQL lebih banyak rentan terhadap kesalahan kualitas data, jadi menghapusnya bukanlah saran yang baik.
Bayangan
205

Ini disebabkan oleh STRICT_TRANS_TABLESmode SQL yang ditentukan di file

% PROGRAMDATA% \ MySQL \ MySQL Server 5.6 \ my.ini

mengajukan. Menghapus pengaturan itu dan memulai ulang MySQL akan menyelesaikan masalah.

Lihat https://www.farbeyondcode.com/Solution-for-MariaDB-Field--xxx--doesn-t-have-a-default-value-5-2720.html

Jika mengedit file tersebut tidak menyelesaikan masalah, lihat http://dev.mysql.com/doc/refman/5.6/en/option-files.html untuk kemungkinan lokasi file konfigurasi lainnya.

Phyxx
sumber
5
Anda dapat menjalankan kueri SQL dalam alat manajemen basis data Anda, seperti phpMyAdmin: -- verified that the mode was previously set select @@GLOBAL.sql_mode; -- UPDATE MODE SET @@global.sql_mode= 'YOUR_VALUE';
anasanjaria
5
tapi mungkin Anda ingin STRICT_TRANS_TABLES?
Andrew
dalam kasus saya bidang tersebut adalah tipe DATETIME dengan default ditetapkan sebagai NULL, dan saya masih melihat kesalahan yang sama, saya memiliki dua skema pada database yang sama. satu untuk Staging, satu lagi untuk produksi, dengan struktur tabel yang sama. Ia bekerja di satu skema, tetapi tidak bekerja di skema lain dengan struktur tabel yang persis sama di keduanya. Saya bingung .. Saya tidak yakin apakah ini masalah dengan STRICT_TRANS_TABLES
dresh
1
Saya menghapus STRICT_TRANS_TABLES dari /etc/my.cnf - di baris yang dimulai dengan sql_mode - dan memulai kembali layanan mysql dan masalah hilang.
Mike Volmar
92

Buka phpmyadmin dan buka Tab 'Lainnya' dan pilih submenu 'Variabel'. Gulir ke bawah untuk menemukan mode sql. Edit mode sql dan hapus 'STRICT_TRANS_TABLES' Simpan.

Nilesh Dhangare
sumber
22
Pertanyaan ini tentang MySQL, dan tidak menyebutkan phpmyadmin. Tolong jangan berasumsi bahwa setiap orang menjalankan itu.
Chris
2
@ jackadams49 Perubahan ini tidak berlaku. Dapatkah Anda memberi tahu saya apa yang Anda lakukan untuk membuat perubahan ini bertahan saat sistem reboot?
LD James
8
@ jackadams49 untuk membuatnya tetap,, sudo nano /etc/mysql/my.cnfmenambah [mysqld] sql_mode = "ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION", menyimpan dan keluar, dan restart mysql sudo service mysql restart
maan81
1
Untuk menambahkan, saya harus mengubah nilai sql_modemenjadi nol, yaitu sql_mode = ""untuk kesalahan serupa lainnya.
maan81
Kami baru saja meningkatkan MySQL kami menjadi 5.7. Kami menghadapi terlalu banyak masalah. Ini berhasil untuk saya. Menyelamatkan hariku.
Murid
38

Di phpmyadmin, lakukan hal berikut:

select @@GLOBAL.sql_mode

Dalam kasus saya, saya mendapatkan yang berikut:

ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES ,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Salin hasil ini dan hapus STRICT_TRANS_TABLES. Kemudian lakukan hal berikut:

set GLOBAL sql_mode='ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
Kamil
sumber
ya tetapi untuk itu Anda harus masuk ke phpmyadmin dengan akun root :) akun super
pengguna889030
1
setelah menghabiskan empat jam, solusi ini berfungsi untuk saya di Ubuntu 16.04. Bagus !
Waleed Ahmed
3
Anda tidak perlu phpmyadminsama sekali, gunakan perintah ini di mysqlbaris perintah.
gustyaquino
4
ini akan diatur ulang ke default setelah mysql / server / pc restart. Anda perlu mengedit /etc/mysql/mysql.conf.d/mysqld.cnf, dan setelah [mysqld] tambahkan baris ini: sql_mode = 'ONLY_FULL_GROUP_BY, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_UBSTITUTION'
waza123
solusi oleh @ waza123, yang satu ini berfungsi untuk saya setelah memutakhirkan ke mysql 5.7.20. terima kasih
fredy kardian
28

Ketika saya memiliki masalah yang sama dengan mysql5.6.20 yang diinstal dengan Homebrew, saya menyelesaikannya dengan masuk ke my.cnf

nano /usr/local/Cellar/mysql/5.6.20_1/my.cnf

Temukan garis yang terlihat seperti ini:

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

Beri komentar di atas baris keluar dan mulai ulang server mysql

mysql.server restart

Kesalahan hilang!

Kingsley Ijomah
sumber
15

Jalankan konsol mysql:

mysql -u your_username -p

, pilih database:

USE your_database;

dan jalankan (juga dari konsol mysql):

SET GLOBAL sql_mode='';

Itu akan mematikan mode ketat dan mysql tidak akan mengeluh lagi.

Untuk memperjelas: definisi database Anda mengatakan "bidang ini harus memiliki nilai default yang ditentukan", dan dengan melakukan langkah-langkah di atas Anda mengatakan ke MySql "neah, abaikan saja". Jadi, jika Anda hanya ingin melakukan perbaikan cepat secara lokal, solusi ini tidak masalah. Tetapi umumnya Anda harus menyelidiki dalam definisi database Anda dan memeriksa apakah bidang benar-benar membutuhkan nilai default dan jika demikian menyetelnya. Dan jika nilai default tidak diperlukan, persyaratan ini harus dihapus agar situasi bersih.

MilanG
sumber
Ya, jangan tambahkan default, hapus saja aturannya, solusi hebat (tersirat dalam sarkasme) tidak pernah melakukan ini sebagai contoh buruk yang hebat. Ini memecahkan masalah meskipun
zardilior
1
Ya, setuju dengan Anda. Tetapi kadang-kadang Anda mendapat proyek orang lain, yang berjalan dengan baik yaitu pada produksi (di mana mode ketat tidak disetel) dan Anda hanya ingin menambahkan beberapa fitur kecil atau perbaikan bug, bekerja secara lokal. Anda tidak ingin melawan naga, hanya untuk membuat benda sialan itu bekerja. :)
MilanG
untuk skenario itu saya setuju
zardilior
@zardilior apa masalahnya? nilai default dipilih berdasarkan jenis kolom jika aturan dihapus .. Saya tidak melihat ada yang salah tentangnya: / aturan itu cukup keras tanpa alasan.
Reloecc
1
Tidak kasar sama sekali, itu hanya memaksa Anda untuk mendeklarasikan default atau memberikan nilai, juga mode ketat berfungsi untuk lebih banyak hal daripada hanya itu, jadi menonaktifkannya, alih-alih mendeklarasikan deault pada kolom atau meneruskan nilainya, sangat buruk lebih banyak prod. Anda menonaktifkan salah satu characteritics mysql yang baik di sana
zardilior
13

Seperti yang dikatakan orang lain, ini disebabkan oleh STRICT_TRANS_TABLESmode SQL.

Untuk memeriksa apakah STRICT_TRANS_TABLESmode diaktifkan:

SHOW VARIABLES LIKE 'sql_mode';

Untuk menonaktifkan mode ketat:

SET GLOBAL sql_mode='';
Damjan Pavlica
sumber
Hapus "STRICT_TRANS_TABLES" secara manual dari variabel> sql_mode untuk pengujian dan berhasil!
Prem popatia
1
Anda menyelamatkan hari saya.
umarbilal
Bagi saya setelah menjalankan perintah kedua dan memeriksa sql_mode (perintah pertama) tidak melakukan apa-apa. Bahkan setelah me-restart layanan mysql. Debian 9
trainoasis
12

Sebelum setiap tindakan penyisipan saya menambahkan baris di bawah dan menyelesaikan masalah saya,

SET SQL_MODE = '';

Saya tidak yakin apakah ini solusi terbaik,

SET SQL_MODE = ''; INSERT INTO  `mytable` (  `field1` ,  `field2`) VALUES ('value1',  'value2');
Vinith
sumber
1
Tidak perlu melakukan itu sebelum setiap tindakan penyisipan, cukup lakukan satu kali di awal skrip Anda, tepat setelah menyambungkan ke database, dan setiap kueri penyisipan akan berfungsi tanpa kesalahan "Bidang tidak memiliki nilai default".
José Carlos PHP
Solusi ini baik-baik saja karena Anda tidak perlu mengubah tabel (mungkin ada banyak bidang yang harus diubah).
José Carlos PHP
11

Ini berfungsi dan diuji Salin ke File Konfigurasi: /etc/mysql/my.cnf ATAU /bin/mysql/my.ini

[mysqld]
port = 3306
sql-mode=""

kemudian mulai ulang MySQL

Devraj Gupta
sumber
9

Ubah kueri Anda dan tambahkan "ABAIKAN" sebagai:

INSERT IGNORE INTO  `mytable` (  `field1` ,  `field2`) VALUES ('value1',  'value2');
Rohit Dhiman
sumber
ini berhasil untuk saya - skrip PHP saya akan dibatalkan, tetapi dengan ABAIKAN, itu hanya iklan baris baru! Sekarang, seberapa "aman" untuk mengabaikan hardcode ke dalam kueri PHP-MYSQL? Saya menggunakan ini untuk menambahkan baris secara otomatis, untuk "hari" baru, yang sebelumnya tidak ada
Levchik
@Levchik Ketika Anda menggunakan IGNORE, alih-alih kesalahan, MySQL mengeluarkan peringatan ketika kesalahan terjadi, sebagai gantinya, dan akan mencoba menyelesaikan instruksi entah bagaimana: mysqltutorial.org/mysql-insert-ignore
Stefan
6

Untuk pengguna Windows WampServer :

WAMP> MySQL> my.ini

cari file untuk sql-mode=""

Batalkan komentar.

Andrew
sumber
2
Dalam versi saya, saya harus mengubah: sql-mode="STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"sql-mode="STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"menjadi sql-mode="". Tidak berkomentar sql-mode=""menyebabkan kesalahan.
Julian
5

Hal ini tampaknya disebabkan oleh bug yang sudah berlangsung lama (sejak 2004) (# 6295) di MySQL , berjudul

Pemicu tidak diproses untuk kolom NOT NULL .

Itu diduga diperbaiki dalam versi 5.7.1 MySQL (Changelog, entri terakhir) pada tahun 2013, membuat MySQL berperilaku "sesuai standar SQL" (ibid).

B98
sumber
Saya meningkatkan dari 5.6 menjadi 5.7.11 dan masalahnya telah diperbaiki untuk saya (dan penghapusan STRICT_TRANS_TABLES tidak berhasil untuk saya), jadi saya menaikkan suara ini dan menurunkan suara sisanya dari jawaban
knocte
5
@knocte Tidak semua orang dapat mengupgrade MySQL di sistemnya, jadi tidak ada gunanya downvoting untuk mendukung ini.
JulienD
Satu-satunya jawaban yang sangat membantu saya. Menghapus NOT NULLbatasan atau menambahkan nilai default ke kolom memperbaiki masalah. Pemicu berfungsi seperti yang diharapkan.
Ruslan Stelmachenko
3

Di Windows Server, edit my.ini (misalnya file program \ mysql \ mysql server nn \ my.ini)

Saya tidak akan begitu saja mengatur sql-mode = "", melainkan saya menyarankan seseorang menghapus STRICT_TRANS_TABLES dari baris, membiarkan semuanya apa adanya, dan kemudian restart MySQL dari utilitas layanan. Tambahkan komentar untuk programmer masa depan siapa Anda dan apa yang Anda lakukan.

Bill Degnan
sumber
Jawaban ini mengatakan hal yang sama. stackoverflow.com/a/52004654/10431118
karma4917
Secara umum ya, tapi maksud saya adalah saya mengatakan secara khusus untuk tidak mengosongkan semua nilai sql-mode, melainkan hanya menghapus STRICT_TRANS_TABLES saja, karena hanya itu yang Anda butuhkan. Jika tidak, Anda dapat memengaruhi beberapa layanan lain.
Bill Degnan
1

saya mengatur bidang menjadi tidak null dan masalah terpecahkan, itu diperbarui ketika sebuah informasi diperintahkan untuk disimpan di dalamnya, tidak ada lagi yang menunjukkan pesan msqli bahwa bidang itu kosong karena Anda tidak memasukkan nilai ke dalamnya, aplikasi solusi ini dapat bekerja pada beberapa proyek tergantung pada struktur proyek Anda.

ExploreTech
sumber
Ini memecahkan kesalahan saya dengan mengubah defaultatribut kolom dari nonemenjadi NULL. Kecuali jawaban peringkat tinggi! cPanel saya memberi saya akses ditolak pada shared hosting ketika saya mencoba memperbarui variabel sql_mode.
Rashid
0

saya memecahkan masalah mengubah file my.ini yang terletak di folder data. untuk mysql 5.6 file my.ini dipindahkan ke folder data bukan folder bin atau folder instalasi mysql.

sadik keskin
sumber
0

Saya pikir dalam kolom nama memiliki nilai nol dalam kasus ini.

update try set name='abc' where created_by='def';
  
Sasindu
sumber