Вашата UPDATE клауза задава id_publisher колона на NULL и въз основа на името на колоната и грешката, която получавате, това колоната е PRIMARY KEY на таблицата с настройка на unsigned NOT NULL .
Поради това, когато направите id_publisher = NULL , MySQL го преобразува в id_publisher = 0 поради unsigned част. Това ще се изпълни добре първия път, но когато го стартирате на втори ред, сега ще се опитвате да вмъкнете втори стойност на първичен ключ 0 , което не е позволено.
Въз основа на местоположението на die() във вашия примерен код, предполагам, че следният блок е виновникът:
$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);
Ето вашия $id_publis променливата е празна или нула.
Предлагам или да премахнете id_publisher = NULL част от UPDATE клауза, която е толкова проста, колкото премахването на 'id_publisher' => $id_publis, от $data1 масив или преосмислете причината, поради която всъщност трябва да го зададете на null като начало (в този случай изтриването на реда ще бъде ли по-полезно?)