Search code examples
mysqltriggersmysql-8.0

Mysql8 complains about missing default value with auto increment field


I have to migrate an old Mysql Db to a new mysql8 server.

I have an update statement in my code, which generates this sql, which throws an error:

UPDATE artikel
SET personalnummer    = 'p325111',
    empfangendes_haus = '612',
    status            = '10',
    freigegeben       = 'nein',
    aenderung_durch   = 'intranet',
    kommentar         = 'serdfghfdf',
    seriennummer      = 'y5e4rzthfrzu',
    lagerstellplatz   = 'jhgfds',
    zustand           = 0,
    zeitpunkt         = '2023-07-24 18:41:45'
WHERE barcode = '59655420705527500276'

The update statement does only update a selection of my 27 fields in the table. The auto increment field, which is also the primary key is a bigint field called "inkrement".

If I execute the statement I get this message from the db server:

[HY000][1364] Field 'inkrement' doesn't have a default value

Yeah no surprise there, since it is the auto increment field it has no default value.

If I export the structure of the table it looks like this (sorry to copy so much, but somewhere might be the problem in this, may it be indexes or triggers or...) :

create table if not exists mimo2.artikel
(
    barcode                           varchar(50)                                                  default ''                not null,
    inkrement                         bigint auto_increment primary key,
    lieferscheinnr                    int unsigned                                                 default '0'               not null,
    rechnungsnr                       varchar(16)                                                  default ''                not null,
    lieferantennr                     int(6) unsigned zerofill                                     default 0                 not null,
    artikelnr                         varchar(8)                                                   default ''                not null,
    laufende_nr                       int unsigned                                                 default '0'               not null,
    pruefziffer                       tinyint unsigned                                             default '0'               not null,
    ausgehendes_haus                  int unsigned                                                 default '0'               not null,
    empfangendes_haus                 int unsigned                                                 default '0'               not null,
    datum_aenderung_empfangendes_haus datetime                                                                               null,
    lagerort                          enum ('nebenflaeche', 'verkauf', 'undefiniert')              default 'undefiniert'     not null,
    freigegeben                       enum ('ja', 'nein')                                          default 'nein'            not null,
    status                            int unsigned                                                 default '3'               not null,
    datum_statusaenderung             datetime                                                                               null,
    preis                             double(20, 2)                                                default 0.00              not null,
    waehrung                          varchar(255)                                                 default ''                not null,
    personalnummer                    varchar(7)                                                   default ''                not null,
    zeitpunkt                         timestamp                                                    default CURRENT_TIMESTAMP not null,
    kommentar                         longtext                                                                               not null,
    bildpfad                          varchar(255)                                                                           null,
    aenderung_durch                   enum ('lieferant', 'dienstleister', 'intranet', 'unbekannt') default 'unbekannt'       not null,
    datum_anlage_initial              datetime                                                                               not null comment 'Anlage des ersten Datnesatzes zu dem Barcode',
    duplicate                         enum ('none', 'mark', 'dublicated', 'duplicated')            default 'none'            not null,
    zustand                           tinyint                                                      default 0                 not null,
    seriennummer                      text                                                                                   not null,
    lagerstellplatz                   text                                                                                   not null,
    constraint Secondary_Key
        unique (barcode),
    constraint artikel_ibfk_1
        foreign key (status) references mimo2.status (nr)
            on update cascade on delete cascade,
    constraint artikel_ibfk_2
        foreign key (zustand) references mimo2.zustand (zustand)
            on update cascade on delete cascade
)
    collate = utf8_unicode_ci;

create index artikelnr
    on mimo2.artikel (artikelnr);

create index ausgehendes_haus
    on mimo2.artikel (ausgehendes_haus);

create index datum_aenderung_empfangendes_haus
    on mimo2.artikel (datum_aenderung_empfangendes_haus);

create index empfangendes_haus
    on mimo2.artikel (empfangendes_haus);

create index freigegeben
    on mimo2.artikel (freigegeben);

create index lagerort
    on mimo2.artikel (lagerort);

create index laufende_nr
    on mimo2.artikel (laufende_nr);

create index lieferantennr
    on mimo2.artikel (lieferantennr);

create index personalnummer
    on mimo2.artikel (personalnummer);

create index status
    on mimo2.artikel (status);

create index zeitpunkt
    on mimo2.artikel (zeitpunkt);

create index zustand
    on mimo2.artikel (zustand);

create definer = `my-db-user`@`` trigger mimo2.artikel_history_before_delete
    before delete
    on mimo2.artikel
    for each row
    INSERT INTO mimo2.artikel_historie
    SET barcode              = OLD.barcode,
        lieferscheinnr       = OLD.lieferscheinnr,
        rechnungsnr          = OLD.rechnungsnr,
        lieferantennr        = OLD.lieferantennr,
        artikelnr            = OLD.artikelnr,
        laufende_nr          = OLD.laufende_nr,
        pruefziffer          = OLD.pruefziffer,
        ausgehendes_haus     = OLD.ausgehendes_haus,
        empfangendes_haus    = OLD.empfangendes_haus,
        lagerort             = OLD.lagerort,
        freigegeben          = OLD.freigegeben,
        status               = OLD.status,
        preis                = OLD.preis,
        waehrung             = OLD.waehrung,
        personalnummer       = OLD.personalnummer,
        zeitpunkt            = OLD.zeitpunkt,
        kommentar            = OLD.kommentar,
        bildpfad             = OLD.bildpfad,
        aenderung_durch      = OLD.aenderung_durch,
        datum_anlage_initial = OLD.datum_anlage_initial,
        dublicate            = OLD.duplicate,
        zustand              = OLD.zustand,
        historie_datum       = NOW();

create definer = `my-db-user`@`` trigger mimo2.artikel_history_before_update
    before update
    on mimo2.artikel
    for each row
    INSERT INTO mimo2.artikel_historie
    SET barcode              = OLD.barcode,
        lieferscheinnr       = OLD.lieferscheinnr,
        rechnungsnr          = OLD.rechnungsnr,
        lieferantennr        = OLD.lieferantennr,
        artikelnr            = OLD.artikelnr,
        laufende_nr          = OLD.laufende_nr,
        pruefziffer          = OLD.pruefziffer,
        ausgehendes_haus     = OLD.ausgehendes_haus,
        empfangendes_haus    = OLD.empfangendes_haus,
        lagerort             = OLD.lagerort,
        freigegeben          = OLD.freigegeben,
        status               = OLD.status,
        preis                = OLD.preis,
        waehrung             = OLD.waehrung,
        personalnummer       = OLD.personalnummer,
        zeitpunkt            = OLD.zeitpunkt,
        kommentar            = OLD.kommentar,
        bildpfad             = OLD.bildpfad,
        aenderung_durch      = OLD.aenderung_durch,
        datum_anlage_initial = OLD.datum_anlage_initial,
        dublicate            = OLD.duplicate,
        zustand              = OLD.zustand,
        historie_datum       = NOW();


Solution

  • The most likely cause is an inkrement field in your artikel_historie table which is specified as NOT NULL but not being populated. Either make it nullable or add it to the list of fields in the two triggers. If adding it to the triggers, you might want to set PK on (inkrement, historie_datum).