mysql hatası 1364 Alanının varsayılan değerleri yok


113

Masam şuna benziyor

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

ve sonra CREATED_BY alanını otomatik olarak doldurmak için bir tetikleyicim var

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

Kullanarak bir kesici uç yaptığımda

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

giriş tabloda yapılmış ancak yine de hata mesajı alıyorum

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

Alanı null yapılabilir hale getirmeden VE tetikleyiciyi kaldırmadan bu hatayı bastırmanın bir yolu var mı? Aksi takdirde, hazırda bekletmem bu istisnaları görecek (eklemeler yapılmış olsa bile) ve ardından uygulama çökecektir.

Yanıtlar:


28

İçin varsayılan bir değer ayarlayın Created_By(örneğin: boş VARCHAR) ve tetikleyici değeri yine de güncelleyecektir.

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

Bir Java programında varsayılan bir değer nasıl ayarlanır?
Nagarajan Shanmuganathan

1
tablonun tanımında varsayılan bir değere ihtiyacınız var (tablo deneyin (isim varchar (8), CREATED_BY varchar (40) VARSAYILAN '' değil))
KinSlayerUY

Bu, kök sorununu ele almaz. Aşağıdaki Phyxx'in çok daha kapsamlı cevabına bakın.
csvan

3
@csvan Phyxx'in cevabı temel nedeni de ele almıyor çünkü kök neden MySQL'de v5.7.1'de düzeltilen bir hataydı - B98 tarafından verilen yanıta bakın: stackoverflow.com/a/29854279/5389997 Katı_trans_tablo sql modunun kaldırılması MySQL'i daha fazla yapar veri kalitesi hatalarına meyillidir, bu nedenle onu kaldırmak gerçekten iyi bir tavsiye değildir.
Gölge

205

Bu, STRICT_TRANS_TABLESiçinde tanımlanan SQL modundan kaynaklanır .

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

dosya. Bu ayarı kaldırmak ve MySQL'i yeniden başlatmak sorunu çözmelidir.

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

Bu dosyayı düzenlemek sorunu çözmezse, yapılandırma dosyalarının diğer olası konumları için http://dev.mysql.com/doc/refman/5.6/en/option-files.html adresine bakın .


5
Veritabanı yönetim aracınızda phpMyAdmin gibi bir SQL sorgusu çalıştırabilirsiniz: -- verified that the mode was previously set select @@GLOBAL.sql_mode; -- UPDATE MODE SET @@global.sql_mode= 'YOUR_VALUE';
anasanjaria

5
ama belki STRICT_TRANS_TABLES istiyorsundur?
Andrew

benim durumumda alan, varsayılan değer NULL olarak ayarlanmış DATETIME türündedir ve hala aynı hatayı görüyorum, aynı veritabanında iki şema var. biri Staging için, diğeri üretim için, aynı tablo yapılarıyla. Bir şemada çalışır, ancak her ikisinde de tam olarak aynı tablo yapısıyla başka bir şemada çalışmaz. Şaşkınım ..
STRICT_TRANS_TABLES

1
STRICT_TRANS_TABLES'i /etc/my.cnf'den - sql_mode ile başlayan satırda - kaldırdım ve mysql servisini yeniden başlattım ve sorun ortadan kalktı.
Mike Volmar

92

Phpmyadmin'i açın ve 'Daha Fazla' Sekmesine gidin ve 'Değişkenler' alt menüsünü seçin. Sql modunu bulmak için aşağı kaydırın. Sql modunu düzenleyin ve 'STRICT_TRANS_TABLES'i kaldırın Kaydedin.


22
Bu soru MySQL hakkındadır ve phpmyadmin'den hiç bahsetmez. Lütfen herkesin bunu yaptığını varsaymayın.
Chris,

2
@ jackadams49 Bu değişiklik geçerli değil. Bu değişikliğin sistemin yeniden başlatılmasından sağ çıkması için ne yaptığınızı bana söyleyebilir misiniz?
LD James

8
@ jackadams49 kalmasını sağlamak sudo nano /etc/mysql/my.cnf, eklemek [mysqld] sql_mode = "ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION", kaydetmek ve çıkmak ve sudo service mysql restart
mysql'i

1
Eklemek için, diğer benzer hatalar için değerlerini sql_modenull olarak değiştirmem gerekiyordu sql_mode = "".
maan81

Yakın zamanda MySQL'imizi 5.7'ye yükselttik. Çok fazla sorunla karşı karşıyaydık. Bu benim için çalıştı. Günümü kurtardım.
Öğrenci

38

Phpmyadmin'de aşağıdakileri gerçekleştirin:

select @@GLOBAL.sql_mode

Benim durumumda aşağıdakileri alıyorum:

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

Bu sonucu kopyalayın ve kaldırın STRICT_TRANS_TABLES. Ardından şunları yapın:

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'

ya ama bunun için phpmyadmin'e root hesabıyla giriş yapmanız gerekecek :) süper hesap
user889030

1
dört saat geçirdikten sonra, bu çözüm benim için Ubuntu 16.04'te çalıştı. Harika !
Waleed Ahmed

3
hiç ihtiyacınız yok phpmyadmin, bu komutları mysqlkomut satırında kullanın.
gustyaquino

4
mysql / server / pc yeniden başlatıldıktan sonra bu varsayılana sıfırlanacaktır. Sen düzenlemek /etc/mysql/mysql.conf.d/mysqld.cnf gerekiyor ve [mysqld] sonra bu satırı ekleyin: = 'ONLY_FULL_GROUP_BY, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_UBSTITUTION' sql_mode
waza123

@ waza123 tarafından çözüm, bu benim için mysql 5.7.20'ye yükselttikten sonra çalışıyor. teşekkürler
fredy kardian

28

Homebrew ile kurulan mysql5.6.20 ile aynı problemi yaşadığımda, my.cnf'ye giderek çözdüm

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

Şuna benzeyen satırı bulun:

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

Çizginin üzerine yorum yapın ve mysql sunucusunu yeniden başlatın

mysql.server restart

Hata gitti!


15

Mysql konsolunu çalıştırın:

mysql -u your_username -p

, veritabanı seçin:

USE your_database;

ve çalıştırın (ayrıca mysql konsolundan):

SET GLOBAL sql_mode='';

Bu katı modu kapatacak ve mysql artık şikayet etmeyecek.

Her şeyi açıklığa kavuşturmak için: veritabanı tanımınız "bu alanın varsayılan değeri tanımlanmış olmalıdır" diyor ve yukarıdan adımları uygulayarak MySql'e "neah, sadece görmezden gelin" diyorsunuz. Yani, sadece yerel olarak hızlı bir düzeltme yapmak istiyorsanız, bu çözüm tamam. Ancak genellikle veritabanı tanımınızda araştırma yapmanız ve alanın gerçekten varsayılan değere ihtiyaç duyup duymadığını kontrol etmeniz ve gerekiyorsa ayarlamanız gerekir. Ve varsayılan değere gerek yoksa, temiz bir duruma sahip olmak için bu gereksinim kaldırılmalıdır.


Evet bir varsayılan ekleme, sadece kuralları kaldırın, harika bir çözüm (ima edilen alay) bunu asla harika bir kötü örnek yapmayın. Yine de sorunu çözüyor
zardilior

1
Evet, sana katılıyorum. Ama bazen, iyi çalışan, yani üretimde (katı modun ayarlanmamış olduğu) bir başkasının insan projesine sahip olursunuz ve sadece yerel olarak çalışan bazı küçük özellikler veya hata düzeltme eklemek istersiniz. Ejderhalarla savaşmak istemezsin, sırf o lanet şeyin çalışmasını sağlamak için. :)
MilanG

bu senaryo için kabul ediyorum
zardilior

@zardilior sorun nedir? kural kaldırılırsa varsayılan değer sütun türüne göre seçilir .. Bu konuda yanlış bir şey görmüyorum: / bu kural sebepsiz yere oldukça sert.
Reloecc

1
Hiç de sert değil, sadece sizi bir varsayılan beyan etmeye veya bir değer sağlamaya zorlar, ayrıca katı mod yalnızca bundan çok daha fazla şey için çalışır, bu nedenle sütunda bir deault ilan etmek veya değeri geçmek yerine onu devre dışı bırakmak gerçekten korkunç. mor ein prod. Orada mysql iyi karakterlerinden birini devre dışı
bırakırsınız

13

Diğerlerinin dediği gibi, buna STRICT_TRANS_TABLESSQL modu neden olur .

STRICT_TRANS_TABLESModun etkin olup olmadığını kontrol etmek için :

SHOW VARIABLES LIKE 'sql_mode';

Katı modu devre dışı bırakmak için:

SET GLOBAL sql_mode='';

"STRICT_TRANS_TABLES", test için değişkenler> sql_mode'dan manuel olarak kaldırıldı ve işe yaradı!
Prem popatia

1
Günümü kurtardın.
umarbilal

Benim için ikinci komutu çalıştırıp sql_mode'u (1. komut) kontrol ettikten sonra hiçbir şey yapmıyor. Mysql hizmetini yeniden başlattıktan sonra bile. Debian 9
travma

12

Her ekleme işleminden önce, satırın altına ekledim ve sorunumu çözdüm,

SET SQL_MODE = '';

Bunun en iyi çözüm olup olmadığından emin değilim

SET SQL_MODE = ''; INSERT INTO  `mytable` (  `field1` ,  `field2`) VALUES ('value1',  'value2');

1
Bunu her ekleme işleminden önce yapmanız gerekmez, bunu betiğinizin başında, veritabanına bağlandıktan hemen sonra bir kez yapın ve her ekleme sorgusu "Alanın varsayılan bir değeri yok" hatası olmadan çalışacaktır.
José Carlos PHP

Bu çözüm iyidir çünkü tabloları değiştirmenize gerek yoktur (değiştirilecek çok alan olabilir).
José Carlos PHP

11

Çalışması ve Test Dosyasına Kopyala: /etc/mysql/my.cnf VEYA /bin/mysql/my.ini

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

sonra MySQL'i yeniden başlatın


9

Sorgunuzu değiştirin ve şu şekilde "IGNORE" ekleyin:

INSERT IGNORE INTO  `mytable` (  `field1` ,  `field2`) VALUES ('value1',  'value2');

bu benim için çalıştı - PHP betiğim iptal olur, ancak IGNORE ile, sadece yeni satır ekler! Şimdi, IGNORE'un PHP-MYSQL sorgusuna kodlanmış olması ne kadar "güvenli"? Bunu, daha önce bulunmadığı yeni "gün" için otomatik satır eklemek için kullanıyorum
Levchik

@Levchik IGNORE kullandığınızda, bir hata yerine MySQL bir hata olduğunda bir uyarı verir ve bunun yerine talimatı bir şekilde tamamlamaya çalışır: mysqltutorial.org/mysql-insert-ignore
Stefan

6

Windows WampServer kullanıcıları için:

WAMP> MySQL> my.ini

dosyada ara sql-mode=""

Yorumunu kaldır.


2
Benim versiyonunda benim değişikliği gerekiyordu: 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"etmek sql-mode="". Yorum yapılmaması sql-mode=""hataya neden oldu.
Julian

5

Bu sebep gibi görünüyor uzun süredir (2004 yılından bu yana) MySQL hata (# 6295) başlıklı,

NOT NULL sütunları için tetikleyiciler işlenmez .

İddiaya göre MySQL'in 5.7.1 sürümünde (Changelog, son giriş) 2013'te düzeltildi ve MySQL'in "SQL standardına göre" (ibid) davranmasını sağladı.


5.6'dan 5.7.11'e yükselttim ve sorun benim için düzeltildi (ve STRICT_TRANS_TABLES'in kaldırılması benim için işe yaramadı), bu yüzden bunu yükseltiyorum ve geri kalan yanıtları
düşürüyorum

5
@knocte Herkes kendi sisteminde MySQL'i yükseltemez, bu yüzden bunun lehine eksi oy kullanmaya değmez.
JulienD

Bana gerçekten yardımcı olan tek cevap. NOT NULLKısıtlamayı kaldırmak veya sütuna varsayılan değer eklemek sorunu çözdü. Tetik beklendiği gibi çalışıyor.
Ruslan Stelmachenko

3

Windows Server'da my.ini dosyasını düzenleyin (örneğin program dosyaları \ mysql \ mysql sunucusu nn \ my.ini)

Basitçe sql-mode = "" ayarını yapmakla kalmam, bunun yerine STRICT_TRANS_TABLES'i satırdan kaldırmasını, her şeyi olduğu gibi bırakmasını ve ardından MySQL'i servis yardımcı programından yeniden başlatmasını öneririm. Kim olduğunuzu ve ne yaptığınız gelecekteki programcılar için bir yorum ekleyin.


Bu cevap aynı şeyi söylüyor. stackoverflow.com/a/52004654/10431118
karma4917

Genel olarak evet, ama demek istediğim, özellikle sql modunun tüm değerlerini boşaltmamayı, sadece STRICT_TRANS_TABLES'i kaldırmayı özellikle söylüyorum, çünkü ihtiyacınız olan tek şey bu. Aksi takdirde başka bir hizmeti etkileyebilirsiniz.
Bill Degnan

1

alanları boş değil ve problem çözülmüş olarak ayarladım, bir bilginin depolanması için komut verildiğinde güncellenir, artık alanın boş olduğuna dair msqli mesajını göstermez, çünkü ona değer eklemediniz, bu çözümün uygulanması bazılarında çalışabilir projeler proje yapınıza bağlıdır.


Bu sütunun değiştirerek benim hata çözüldü defaultgelen niteliğini noneiçin NULL. Yüksek dereceli cevaplar yoksa! cPanel, sql_mode değişkenini güncellemeye çalıştığımda paylaşılan barındırmada bana erişim izni vermiyordu.
Rashid

0

veri klasöründe bulunan my.ini dosyasını değiştirmeyle ilgili sorunu çözdüm. mysql 5.6 için my.ini dosyası, bin veya mysql yükleme klasörü yerine veri klasörüne taşındı.


0

Sanırım isim sütununda bu durumda boş değerler var.

update try set name='abc' where created_by='def';
  
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.