MySQL Yanlış tarih / saat değeri: '0000-00-00 00:00:00'


155

Kısa bir süre önce, 10 yıl önce oluşturulmuş eski bir projeyi ele aldım. MySQL 5.1 kullanır.

Diğer şeylerin yanı sıra, varsayılan karakter setini latin1'den utf8'e değiştirmem gerekiyor.

Örnek olarak, böyle tabloları var:

  CREATE TABLE `users` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `first_name` varchar(45) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT NULL,
    `last_name` varchar(45) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT NULL,
    `username` varchar(127) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
    `email` varchar(127) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
    `pass` varchar(20) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
    `active` char(1) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL DEFAULT 'Y',
    `created` datetime NOT NULL,
    `last_login` datetime DEFAULT NULL,
    `author` varchar(1) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT 'N',
    `locked_at` datetime DEFAULT NULL,
    `created_at` datetime DEFAULT NULL,
    `updated_at` datetime DEFAULT NULL,
    `ripple_token` varchar(36) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT NULL,
    `ripple_token_expires` datetime DEFAULT '2014-10-31 08:03:55',
    `authentication_token` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `index_users_on_reset_password_token` (`reset_password_token`),
    UNIQUE KEY `index_users_on_confirmation_token` (`confirmation_token`),
    UNIQUE KEY `index_users_on_unlock_token` (`unlock_token`),
    KEY `users_active` (`active`),
    KEY `users_username` (`username`),
    KEY `index_users_on_email` (`email`)
  ) ENGINE=InnoDB AUTO_INCREMENT=1677 DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC

Bunun için kendi Mac bilgisayarımı kurdum. Bu konuda fazla düşünmeden, MySQL 5.7 yüklü "demlemek install mysql" koştu. Bazı sürüm çakışmalar var.

Bu veritabanının bir kopyasını indirip içe aktardım.

Böyle bir sorgu çalıştırmayı denerseniz:

  ALTER TABLE users MODIFY first_name varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci    NOT NULL  

Bu hatayı alıyorum:

  ERROR 1292 (22007): Incorrect datetime value: '0000-00-00 00:00:00' for column 'created' at row 1

Ben bunu düzeltmek düşündüm:

  ALTER TABLE users MODIFY created datetime  NULL DEFAULT '1970-01-01 00:00:00';
  Query OK, 0 rows affected (0.06 sec)
  Records: 0  Duplicates: 0  Warnings: 0

ama anladım:

  ALTER TABLE users MODIFY first_name varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci    NOT NULL ;
  ERROR 1292 (22007): Incorrect datetime value: '0000-00-00 00:00:00' for column 'created' at row 1

Her değeri güncellemem gerekiyor mu?

Yanıtlar:


12

Benim önerim tablonun boş olması veya çok büyük olmaması durumunda, create ifadelerini .sql dosyası olarak dışa aktarmak, istediğiniz gibi yeniden yazmaktır. Varolan verileriniz varsa, yani ekleme deyimlerini dışa aktarırken de aynı işlemi yapın (bunu create ifadeleri olarak ayrı bir dosyada yapmanızı öneririm). Son olarak, tabloyu bırakın ve önce create komutunu ve ardından insertleri yürütün.

mysqldumpMySQL kurulumunuzda bulunan bu komutlardan herhangi birini kullanabilir veya belirli komut seçeneklerini aramak zorunda kalmadan bu seçeneği çok özelleştirilebilir bir şekilde içeren ücretsiz bir grafik aracı olan MySQL Workbench'i de yükleyebilirsiniz.


Lucia Pasarin, fikrinizi çok seviyorum ama veriler kesilmeyecek mi? Bazı UTF8 verileri latin1'den daha fazla bayt kaplıyor mu? Daha önce varchar 255'e uygun bir şey varsa, belki şimdi değil mi? Belki de tüm varchar'ları "metin" alanlarına değiştirmeli miyim?
lorm

Evet haklısın. Bu, latin1 karakter başına 1 bayt kullandığından, utf8 karakter başına en fazla 4 bayt kullandığından (MySQL sürümüne ve utf8 türüne bağlı olarak dev.mysql.com/doc/refman/5.5/en/charset-unicode) -utf8.html ). Bu nedenle, mutlaka METİN türüne ihtiyacınız yoktur. Önceden varolan boyutlarınızın x4'ün çalışması gerektiğini varsayabilirim.
Lucia Pasarin

Bu, bir dosyayı silmek istediğinizde sabit sürücünüzü yeniden biçimlendirmenin veritabanı eşdeğeridir. Bu çözümün üretim ortamında kabul edilebilir olmadığını söylemek güvenlidir.
Brandon

198

Bunu yapamadım:

UPDATE users SET created = NULL WHERE created = '0000-00-00 00:00:00'

(MySQL 5.7.13'te).

Incorrect datetime value: '0000-00-00 00:00:00'Hatayı almaya devam ettim .

Garip bir şekilde, bu çalıştı: SELECT * FROM users WHERE created = '0000-00-00 00:00:00'. Neden eski başarısız ve ikincisi çalışır ... hiçbir fikrim yok belki bir MySQL hata?

Her durumda, bu UPDATE sorgusu çalıştı:

UPDATE users SET created = NULL WHERE CAST(created AS CHAR(20)) = '0000-00-00 00:00:00'

13
Ben de aynı sorunu vardı, ama son kısmı sadece 0 olarak ayarlamak benim için böyle sabit:UPDATE users SET created = NULL WHERE created = '0'
Brian Leishman

SELECT * entityNEREDEN yaratıldığı yerden = = 0000-00-00 00:00:00 "iyi çalışıyor, ancak güncellenmiş bir başarısızlıkla! Ben de aynı problemi yaşadım. @Obe CAST (AS CHAR (20) olarak oluşturuldu) çözümü ile düzeltin ... Bence bu bir hata.
Chrysweel

44
Benim için UPDATE users SET created = NULL WHERE created=0('yaklaşık sıfır olmadan) gibi çalıştı
KIR

1
"0000-00-00" tarihini yalnızca zaman damgası olmadan değiştirmek için CHAR (11)
D.Tate'i

1
Bu saf deha. Bu neden kabul edilen cevap değil? Yalnızca zaman damgası olmadan tarih için minimum değer 1000-01-01'dir. Bunu boş bırakmak istediğiniz her tarih özelliği için varsayılan değer olarak veya 0000-00-00 değeriyle kullanmayı düşünün.
Arvanitis Christos

155

İfadeli bir sütun için varsayılan değeri değiştirme ALTER TABLE, ör.

 ALTER TABLE users MODIFY created datetime  NULL DEFAULT '1970-01-02'

... önceden kaydedilmiş değerleri değiştirmez. "Varsayılan" değer, eklenen ve sütun için bir değer sağlanmayan satırlar için geçerlidir.


Hatayla neden karşılaştığınıza gelince, büyük olasılıkla sql_modeoturumunuz için ayar içerir NO_ZERO_DATE.

Referans: http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_zero_date

"Alma" yaptığınızda, bu tabloya INSERT yapan SQL deyimleri sıfır tarih için izin verilen bir oturumda çalıştırıldı.

Sql_mode ayarını görmek için:

SHOW VARIABLES LIKE 'sql_mode' ;

-veya-

SELECT @@sql_mode ;

Bildiğim kadarıyla mevcut sorunu nasıl "düzeltmek", böylece ALTER TABLEdeyimi çalıştırdığınızda hata atılmaz .

Birkaç seçenek:

1) değiştirmek sql_modekaldırarak, sıfır tarihleri izin vermek NO_ZERO_DATEve NO_ZERO_IN_DATE. Değişiklik my.cnf dosyasında uygulanabilir, bu nedenle MySQL Server'ın yeniden sql_modebaşlatılmasından sonra, my.cnf içindeki ayara değişken başlatılacaktır.

Geçici bir değişiklik için, ayarı global bir değişiklik gerektirmeden tek bir oturumla değiştirebiliriz.

-- save current setting of sql_mode
SET @old_sql_mode := @@sql_mode ;

-- derive a new value by removing NO_ZERO_DATE and NO_ZERO_IN_DATE
SET @new_sql_mode := @old_sql_mode ;
SET @new_sql_mode := TRIM(BOTH ',' FROM REPLACE(CONCAT(',',@new_sql_mode,','),',NO_ZERO_DATE,'  ,','));
SET @new_sql_mode := TRIM(BOTH ',' FROM REPLACE(CONCAT(',',@new_sql_mode,','),',NO_ZERO_IN_DATE,',','));
SET @@sql_mode := @new_sql_mode ;

-- perform the operation that errors due to "zero dates"

-- when we are done with required operations, we can revert back
-- to the original sql_mode setting, from the value we saved
SET @@sql_mode := @old_sql_mode ;

2) createdNULL değerlere izin vermek için sütunu değiştirin ve sıfır tarihleri ​​null değerlere değiştirmek için mevcut satırları güncelleyin

3) sıfır tarihleri ​​geçerli bir tarihe değiştirmek için mevcut satırları güncelleyin


Her satırı güncellemek için ayrı ifadeler çalıştırmamız gerekmez. Tüm satırları tek bir düşüşle güncelleyebiliriz (makul büyüklükte bir tablo olduğu varsayılarak. Daha büyük bir tablo için, geri dönüş / geri almayı önlemek için işlemi makul boyutta parçalar halinde gerçekleştirebiliriz.)

Söz olarak, AUTO_INCREMENTtablo tanımı için gösterilen değer satır sayısı çok fazla olmadığı bize sağlar.

createdSütunu NULLdeğerlere izin verecek şekilde değiştirdiysek , şöyle bir şey yapabiliriz:

UPDATE  `users` SET `created` = NULL WHERE `created` = '0000-00-00 00:00:00'

Veya bunları geçerli bir tarihe ayarlayabiliriz, örneğin 2 Ocak 1970

UPDATE  `users` SET `created` = '1970-01-02' WHERE `created` = '0000-00-00 00:00:00'

(Not gece yarısı 1 Ocak 1970 (bir datetime değeri o '1970-01-01 00:00:00') olan bir "sıfır tarihi". Yani olması değerlendirilecektir'0000-00-00 00:00:00'


3
evet, bu benim için çalıştı. My.ini dosyasında sql modu aradım ve NO_ZERO_IN_DATE ve NO_ZERO_DATE dosyalarını kaldırdım. ardından hizmeti yeniden başlattı. teşekkür ederim spencer7593!
mili


# 2 "NULL değerlere izin vermek için oluşturulan sütunu değiştir" i yaptığımda, sütun değerleri yine de hata ürettiğinden izin vermiyor. Oldukça sıkışmış.
Mike Weir

1
@MikeWeir: muhtemelen " izin vermeyeceğim ", bir SQL ifadesi yürütüldüğünde bir hata döndürüldüğü anlamına gelir. Muhtemelen ayarı nedeniyle sql_mode. MySQL'in daha yeni sürümlerinde varsayılan ayarlar sql_modeönceki sürümlerden daha katıdır. 8.0 için referans: dev.mysql.com/doc/refman/8.0/en/sql-mode.html bkz. NO_ZERO_DATE, VdALLOW_INVALID_DATE . Bazı KESİN mod örneğin içerdiği unutmayın STRICT_TRANS_TABLES, STRICT_ALL_TABLESve diğer açılan modları. Kısıtlamaları geçici olarak
çözmek

@ spencer7593 kesin. Bu seçenek ya da en iyi gibi hissetmedim. Çok eski bir tarih değeri (1970) belirleme tavsiyenizi aldım ve sistemim bunu görmezden gelecek. Tüm detaylarınız için teşekkürler.
Mike Weir

67

Sorgudan önce bunu yaparak düzelttim

SET SQL_MODE='ALLOW_INVALID_DATES';

Tek cevap bu. Olarak kullanılır: --init-command = 'SET SESSION FOREIGN_KEY_CHECKS = 0; SET SQL_MODE =' ALLOW_INVALID_DATES '
Konchog 17:09

Çok teşekkür ederim. Bu sorunun benim için ne kadar acı çektiğini açıklayamıyorum.
Dieter Gribnitz

42

Göre MySQL 5.7 Referans Kılavuzu :

MySQL 5.7'deki varsayılan SQL modu şu modları içerir: ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER ve NO_ENGINE_SUBSTUTION.

Yana 0000-00-00 00:00:00geçerli değildir DATETIMEdeğeri, veritabanı bozuldu. Bu nedenle NO_ZERO_DATE, varsayılan olarak etkin mod ile birlikte gelen MySQL 5.7 , bir yazma işlemi gerçekleştirmeye çalıştığınızda bir hata verir.

Tablonuzun tüm geçersiz değerleri başka geçerli bir değerle güncellemesini düzeltebilirsiniz, örneğin NULL:

UPDATE users SET created = NULL WHERE created < '0000-01-01 00:00:00'

Ayrıca, bu sorunu önlemek için, benzer createdalanları otomatik olarak doldurmak için geçerli saati her zaman varsayılan değer olarak ayarlamanızı tavsiye ederim INSERT. Sadece yap:

ALTER TABLE users
ALTER created SET DEFAULT CURRENT_TIMESTAMP

8
SET sql_mode = 'NO_ZERO_DATE';
UPDATE `news` SET `d_stop`='2038-01-01 00:00:00' WHERE `d_stop`='0000-00-00 00:00:00'

4
Bu sorunun neden sorunu çözdüğü tartışılarak geliştirilebilir.
KevinO

bu datetime depolamasını etkiler mi? ya herhangi bir sorun nedeni
bayt sor

8

İşte benim çözüm PhpMyAdmin / Fedora 29 / MySQL 8.0 (örneğin):

set sql_mode='SOMETHING'; çalışmıyor , komut çağrısı başarılı ama hiçbir şey değişmedi.

set GLOBAL sql_mode='SOMETHING'; genel yapılandırma .

set SESSION sql_mode='SOMETHING'; oturum yapılandırmasını değiştir SESSION değişkeni yalnızca geçerli istemciyi etkiler.

https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html

Yani bunu yapıyorum:

  • SQL_MODE'u edinin: SHOW VARIABLES LIKE 'sql_mode';
  • Sonuç: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
  • Sonucu kaldır: NO_ZERO_IN_DATE,NO_ZERO_DATE
  • Yeni yapılandırma ayarla: set GLOBAL SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'

Aynı şekilde başka bir modu kaldırabilir veya ekleyebilirsiniz.

Bu kullanım ve test için global değiştirmek için yardımcı olur çerçeveler veya sql_mode her dosya veya grup sorgu belirtilmelidir.

Bir sorudan uyarlanmıştır, burada sorun: nasıl-nasıl-i-devre dışı-mysql-katı-modu

Örnek: En yeni Joomla 4.0-alfa içeriğini yükleyin.

Düzenleme: PhpMyadmin, eğer sunucu kontrolü varsa, sql_mode(ve diğer tüm parametreleri) doğrudan değiştirebilirsinizPlus > Variables > sql_mode


5

Sen türünü değiştirebilirsiniz oluşturulan gelen alana datetimekadar varchar(255)o zaman değere sahip tüm kayıtları (güncelleştirme) ayarlayabilirsiniz "0000-00-00 00:00:00"için NULL.

Şimdi, sorgularınızı hatasız yapabilirsiniz. Bitirdikten sonra, alanın türünü değiştirebilir yarattı için datetime.


4

MySQL 5.6'dan 5.7'ye yükselttikten sonra da bu hatayı aldım

Benim için en iyi çözümün bazı çözümleri burada birleştirmek ve minimum girdi ile çalışan bir şey yapmak olduğunu anladım.

MyPHPAdmin'i arayüz üzerinden sorgu göndermenin basitliği için kullanıyorum çünkü o zaman yapıyı ve hepsini kolayca kontrol edebiliyorum. Ssh'yi doğrudan veya başka bir arabirim kullanabilirsiniz. Yöntem yine de benzer veya aynı olmalıdır.

...

1.

Öncelikle db'yi onarmaya çalışırken gerçek hatayı kontrol edin:

joomla.jos_menu Not: Eski biçimdeki TIME / TIMESTAMP / DATETIME sütunları yeni biçime yükseltildi.

Uyarı: Yanlış datetime değeri: 1. satırdaki 'check_out_time' sütunu için '0000-00-00 00:00:00'

Hata: 'check_out_time' için geçersiz varsayılan değer

durum: İşlem başarısız oldu

Bu bana tablodaki check_out_time sütununda jos_menu'nun tüm bozuk tarihlerin düzeltilmesi ve "varsayılan" olarak değişmesi gerektiğini söyler.

...

2.

Hata iletisindeki bilgilere dayanarak SQL sorgusu çalıştırın:

UPDATE jos_menu SET checked_out_time = '1970-01-01 08:00:00' WHERE checked_out_time = 0

Bir hata alırsanız, bunun yerine her zaman çalışır gibi görünen aşağıdaki sorguyu kullanabilirsiniz:

UPDATE jos_menu SET checked_out_time = '1970-01-01 08:00:00' WHERE CAST(checked_out_time AS CHAR(20)) = '0000-00-00 00:00:00'

...

3.

Sonra bir kez yapılır ikinci SQL sorgusu çalıştırın:

ALTER TABLE `jos_menu` CHANGE `checked_out_time` `checked_out_time` DATETIME NULL DEFAULT CURRENT_TIMESTAMP;

Ya da NULL olması gereken bir tarih

ALTER TABLE `jos_menu` CHANGE `checked_out_time` `checked_out_time` DATETIME NULL DEFAULT NULL;

...

Şimdi onarım veritabanı çalıştırırsanız ben olsun:

joomla.jos_menu Tamam

...

Sadece iyi çalışıyor :)


4

Kontrol

SELECT @@sql_mode;

orada 'ZERO_DATE' şeyler görürseniz deneyin

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'NO_ZERO_DATE',''));   
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'NO_ZERO_IN_DATE',''));   

Çıkış yapıp istemcinize tekrar giriş yapın (bu garip) ve tekrar deneyin


3

Sql modunu katı yap

laravel kullanıyorsanız config-> database'e gidin, mysql ayarlarına gidin ve katı modu yanlış yapın


Bunu myphpadmin'de yapabilir miyim?
Don King

phpMyAdmin sadece gerçek mysql sunucusunu kullanmak için bir arayüzdür, mysql komutlarını kullandığınız arayüzün arayüzle değişmeyeceği önemli değildir. Kapatmak için bu komutu (set sql_mode = '';) veya bunu (set global sql_mode = '';) deneyin.
Milind Chaudhary

1
evet ben sıkı mod kapatmak için gereken tüm bu bulundu my.cnf alt tarafından sql_mode = (ve hiçbir şey sonra) ekleyerek bulundu
Don King

3

Benzer bir sorun vardı ama benim durumumda bazı satır null değeri vardı.

ilk önce tabloyu güncelleyin:

update `my_table`set modified = '1000-01-01 00:00:00' WHERE modified is null

Sorun en azından benim durumumda çözüldü.


2

Bende var

SQLSTATE [22007]: Geçersiz datetime biçimi: 1292 Yanlış datetime değeri: sütun için '0000-00-00 00:00:00'

hata bilgisi

Değiştirerek bunu düzeltmek 0000-00-00 00:00:00 için 1970-01-01 08:00:00

1970-01-01 08:00:00 unix zaman damgası 0


1
sorun OP hatası nedeniyle tarihi değiştiremezsiniz. Sanırım bu hataNO_ZERO_DATE
GusDeCooL

2

Çözümü https://support.plesk.com/hc/en-us/articles/115000666509-How-to-change-the-SQL-mode-in-MySQL adresinde buldum . Bu vardı:

mysql> show variables like 'sql_mode';
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value                                                                                                                                     |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| sql_mode      | 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 |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set, 1 warning (0.01 sec)

NO_ZERO_IN_DATE,NO_ZERO_DATEYukarıdaki sonuçlara dikkat edin . Bunu yaparak bunu kaldırdım:

mysql> SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
Query OK, 0 rows affected, 1 warning (0.00 sec)

Sonra bunu vardı:

mysql> show variables like 'sql_mode';
+---------------+--------------------------------------------------------------------------------------------------------------+
| Variable_name | Value                                                                                                        |
+---------------+--------------------------------------------------------------------------------------------------------------+
| sql_mode      | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------+--------------------------------------------------------------------------------------------------------------+
1 row in set, 1 warning (0.01 sec)

Bunu yaptıktan sonra ALTER TABLEbaşarılı bir şekilde kullanabilir ve tablolarımı değiştirebilirim.


1

Sorunumu çözmek için yaptığım şey bu. Yerel MySQL 5.7 Ubuntu 18.04'te test ettim .

set global sql_mode="NO_ENGINE_SUBSTITUTION";

Bu sorguyu global olarak çalıştırmadan önce /etc/mysql/conf.d dizinine bir cnf dosyası ekledim . CNF dosya adı mysql.cnf ve kodları

[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ALLOW_INVALID_DATES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Sonra mysql yeniden başlatın

sudo service mysql restart

Umarım bu birine yardımcı olabilir.


MySQL sunucusunu yeniden başlatana kadar bu çözüm çalışıyor. Yeniden başlattıktan sonra bile değer NO_ENGINE_SUBSTITUTIONtüm sütunlarında SELECT @@global.sql_mode, @@session.sql_mode, @@sql_mode;ama yine 0000-00-00 00:00:00de ilk sorguyu yeniden yürütene kadar geçersiz datetime için bir hata alıyorum set global sql_mode="NO_ENGINE_SUBSTITUTION";Herhangi bir fikir?
Smamatti

Benim durumumdaki çözüm NO_ZERO_IN_DATE,NO_ZERO_DATE, my.ini satırını tanımlayan sürümünüzde kaldırmaktı sql_mode.
Smamatti

1

Bu inanılmaz derecede çirkin, ama aynı zamanda problemi benim için hızlı bir şekilde çözdü. Tablonuzun renkli sütunları düzeltmek için kullanacağınız benzersiz bir anahtara ihtiyacı var. Bu örnekte, birincil anahtara 'id' ve bozuk zaman damgası sütununa 'BadColumn' adı verilir.

  1. Renkli sütunların kimliklerini seçin.

    select id from table where BadColumn='0000-00-00 00:00:00'

  2. Kimlikleri virgülle ayrılmış bir dizeye toplayın. Örnek: 1, 22, 33. Ben hızlı bir şekilde hepsini tükürmek için bu (Perl betiği) için harici bir sarmalayıcı kullandım.

  3. Eski sütunları geçerli bir tarihle güncellemek için kimlik listenizi kullanın (1971-2038).

    update table set BadColumn='2000-01-01 00:00:00' where id in (1, 22, 33)


1

Çözümüm

SET sql_mode='';
UPDATE tnx_k2_items
SET created_by = 790
, modified = '0000-00-00 00:00:00'
, modified_by = 0

1

Onun yerine

UPDATE your_table SET your_column = new_valid_value where your_column = '0000-00-00 00:00:00';

kullanım

UPDATE your_table SET your_column = new_valid_value where your_column = 0;

0

Verileri manuel olarak giriyorsanız, TIMESTAMP (6) .000000 üzerindeki değerleri ve sıfırları TIMESTAMP olacak şekilde kaldırmayı düşünebilirsiniz. Benimle iyi çalıştı.

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.