Twoja UPDATE klauzula ustawia id_publisher kolumna na NULL , a na podstawie nazwy kolumny i wyświetlanego błędu że kolumna to PRIMARY KEY tabeli z ustawieniem unsigned NOT NULL .
Z tego powodu, gdy robisz id_publisher = NULL , MySQL konwertuje go na id_publisher = 0 ze względu na unsigned część. Za pierwszym razem zadziała to dobrze, jednak po uruchomieniu w drugim wierszu będziesz teraz próbował wstawić sekundę wartość klucza podstawowego 0 , co jest niedozwolone.
Na podstawie lokalizacji die() w przykładowym kodzie, zakładam, że winowajcą jest następujący blok:
$data1 = array(
'id_publisher' => $id_publis,
'publisher' => $publis,
'artis' => $ar,
'id_label' => $id_lab);
$this->db->where('id_publisher', $this->input->post('id'), $data);
$this->db->update("t_publisher",$data1);
Tutaj Twój $id_publis zmienna jest pusta lub null.
Proponuję albo usunąć id_publisher = NULL fragment z UPDATE klauzula, która jest tak prosta jak usunięcie 'id_publisher' => $id_publis, z $data1 tablicę lub przemyśl powód, dla którego faktycznie musisz ustawić ją na null na początek (czy w takim przypadku usunięcie wiersza byłoby korzystniejsze?)