olla
olla

Reputation: 13

mysql insert values select not exist

How to make this work I'm preventing INSERT in a loop? i get sql error code 1093 with this, and it's array result:

INSERT INTO kelengkapan_berkas (id_buyer, nama_berkas) VALUES

('1', (SELECT jenis_berkas.nama_berkas FROM jenis_berkas WHERE id_job = '1' AND NOT EXISTS (SELECT id_buyer FROM kelengkapan_berkas WHERE id_buyer = '1'))),

('2', (SELECT jenis_berkas.nama_berkas FROM jenis_berkas WHERE id_job = '1' AND NOT EXISTS (SELECT id_buyer FROM kelengkapan_berkas WHERE id_buyer = '2'))),

('3', (SELECT jenis_berkas.nama_berkas FROM jenis_berkas WHERE id_job = '1' AND NOT EXISTS (SELECT id_buyer FROM kelengkapan_berkas WHERE id_buyer = '3')))

My looping code work but i need to avoid because of the connection storming XD:

    while($rows=mysqli_fetch_array($res)){
    $sql="INSERT INTO kelengkapan_berkas 
               (id_buyer, nama_berkas) 
          SELECT    '$rows[id]', 
              jenis_berkas.nama_berkas 
          FROM jenis_berkas 
          WHERE id_job = '$rows[job]' AND NOT EXISTS 
             (SELECT * FROM kelengkapan_berkas WHERE id_buyer = '$rows[id]')";
    $result=mysqli_query($con,$sql);}

or any idea to do this with trigger or procedure? thx

Upvotes: 1

Views: 100

Answers (4)

olla
olla

Reputation: 13

Sorry guys I'm new in this stuff but actually the point is I want to make sure all new record will be inserted to new table, using php is a bit hard n causing looping that cause slow down so I do trigger with MySQL and the result is the same with what I want.

DELIMITER |

CREATE DEFINER = 'root'@'localhost' TRIGGER `copy_berkas`
AFTER INSERT
ON `buyer`
FOR EACH ROW
INSERT INTO kelengkapan_berkas 
(id_buyer, nama_berkas) 
SELECT NEW.id, jenis_berkas.nama_berkas 
FROM jenis_berkas WHERE jenis_berkas.id_job = NEW.job|

DELIMITER ;

Sorry for the Trouble

Upvotes: 0

This restriction is documented in the MySQL manual:

Currently, you cannot update a table and select from the same table in a subquery.

As a workaround, you can wrap the sub-query in another sub-query(Nested) and avoid that error.

INSERT INTO kelengkapan_berkas (id_buyer, nama_berkas) VALUES 
('1', (SELECT NAME (SELECT jenis_berkas.nama_berkas NAME FROM jenis_berkas WHERE id_job = '1') ,.....

Upvotes: 2

manikandan
manikandan

Reputation: 9

step 1: select the records from the db, and then constructed into array, step 2: finally you can do insert query from above selected records,

this should be easy

Upvotes: 0

Mark Twells
Mark Twells

Reputation: 1

Table design.

Make ID buyer a unique index and trap exceptions in your code.

Then you can only add id_buyer=1 once.

If you really don't want to fail:

select count(*) as num where id_buyer=1
#get num into your code
if(num==0) 
  insert

Upvotes: 0

Related Questions