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 ;