Il tuo UPDATE la clausola sta impostando il id_publisher colonna su NULL e, in base al nome della colonna e all'errore che stai ricevendo, quello colonna è la PRIMARY KEY della tabella con un'impostazione di unsigned NOT NULL .
Per questo motivo, quando esegui id_publisher = NULL , MySQL lo converte in id_publisher = 0 a causa del unsigned parte. Questo verrà eseguito correttamente la prima volta, tuttavia, quando lo esegui su una seconda riga, ora tenterai di inserire un secondo valore della chiave primaria di 0 , che non è consentito.
Basato sulla posizione del die() dichiarazione nel tuo codice di esempio, presumo che il seguente blocco sia il colpevole:
$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);
Qui, il tuo $id_publis la variabile è vuota o nulla.
Suggerirei di rimuovere id_publisher = NULL parte dal UPDATE clausola che è semplice come rimuovere 'id_publisher' => $id_publis, dal $data1 array o ripensa al motivo per cui hai effettivamente bisogno di impostarlo su null per cominciare (in questo caso, eliminare la riga sarebbe più vantaggioso?)