random data insertion with primary key and key constraints Error Code 1062 Duplicate entry for key

38 Views Asked by At

i'm trying to create a wine cellar database, with MySQL, for an university project.

create table Produttore(
    p_iva bigint(11) unsigned not null,
    indirizzo varchar(40),
    num_telefono varchar(20),
    primary key(p_iva)
)
ENGINE=InnoDB;

create table Dipendente(
    cf varchar(16) not null,
    nome varchar(100) not null,
    cognome varchar(100) not null,
    indirizzo varchar(200),
    num_telefono varchar(20),
    primary key(cf)
)
ENGINE=InnoDB;

create table Cliente(
    cf varchar(16) not null,
    nome varchar(100) not null,
    cognome varchar(100) not null,
    indirizzo varchar(40),
    num_telefono varchar(20),
    primary key(cf)
)
ENGINE=InnoDB;

create table Bottiglia(
    codice bigint(8) unsigned not null,
    tipo_bottiglia varchar(20) not null,
    produttore bigint(11) unsigned not null,
    annata year not null,
    gradazione_alcolica decimal (5, 2) not null,
    costo decimal(5, 2) not null,
    primary key(codice),
    foreign key(produttore) references Produttore(p_iva)
    on delete cascade
    on update cascade
)
ENGINE=InnoDB;

create table Vino(
    codice bigint(8) unsigned not null,
    tipo_vino enum('rosso', 'bianco') not null,
    vitigno varchar(40) not null,
    primary key(codice),
    foreign key(codice) references Bottiglia(codice)
    on delete cascade
    on update cascade
)
ENGINE=InnoDB;

create table Spumante(
    codice bigint(8) unsigned not null,
    metodo enum('metodo calssico', 'metodo martinotti') not null,
    vitigno varchar(20) not null,
    primary key(codice),
    foreign key(codice) references Bottiglia(codice)
)
ENGINE=InnoDB;

create table Distillato(
     codice bigint(8) unsigned not null,
     tipologia varchar(20) not null,
     composizione varchar(20) not null,
     primary key(codice),
     foreign key(codice) references Bottiglia(codice)
)
ENGINE=InnoDB;

I want to fill each table with random data so i created a procedure for each table.

I filled the Bottiglia (Bottle) table, which has codice as primary key, but now that i want to fill the Vino (Wine) table (which is a child of Bottiglia, so it has codice as primary and foreign key)

Error Code: 1062. Duplicate entry '81584254' for key 'vino.PRIMARY'

drop procedure if exists insert_vino;
delimiter $$
create procedure insert_vino()
begin
    declare c int; -- contatore
    declare var int;
    declare tipo enum('rosso', 'bianco');
    declare viti varchar(40);
    set foreign_key_checks=0;
    select count(codice) into var from bottiglia where tipo_bottiglia = "vino";
    set c = 1;
    start transaction;
    while c <= var do
        while c <= 175 do
            update vino
                set vino.codice = (SELECT codice
                    FROM bottiglia
                    WHERE codice is not null and bottiglia.tipo_bottiglia='vino'
                    ORDER BY rand()
                    LIMIT 1);
            set tipo = 'rosso';
            set viti = elt(floor(1 + rand() * 10), 'barbera', 'dolcetto', 'nebbiolo'
                                   ,'corvina', 'rondinella', 'sangiovese', 'nero d avola', 'syrah'
                                   ,'cerasuolo di vittoria', 'nerello mascalese');
            insert into vino(codice, tipo_vino, vitigno)
            values(vino.codice, tipo, viti);
            set c = c + 1;
        end while;
        update vino
        set vino.codice = (SELECT codice
                FROM bottiglia
                WHERE codice is not null and bottiglia.tipo_bottiglia = 'vino'
                ORDER BY rand()
                LIMIT 1);
        set tipo = 'bianco';
        set viti = elt(floor(1 + rand() * 9), 'timorasso', 'pinot bianco', 'pinot grigio'
                           ,'soavignon blanc', 'friuliano', 'vermentino', 'pecorino',
                           'malvasia del lazio', 'grillo');
        insert into vino(codice, tipo_vino, vitigno)
        values(vino.codice, tipo, viti);
        set c = c + 1;
    end while;
    set foreign_key_checks=1;
end $$
delimiter ;
0

There are 0 best solutions below