#mysql #sql
#mysql #sql
Вопрос:
У меня есть эти таблицы
CREATE TABLE persona(
id INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(30),
apPaterno VARCHAR(30),
ine VARCHAR(12) unique);
CREATE TABLE cliente( cuenta INT PRIMARY KEY,
saldoapertura DOUBLE,
fechaRe&istro DATE,
sucursal VARCHAR(30),
idPersona int,
FOREIGN KEY(idPersona) REFERENCES persona(id));
Речь идет о моделировании банка, в котором идентификация уникальна для каждого человека (ine), я хочу знать, есть ли способ вставить человека с разными учетными записями несколько раз. Даже если предложение ‘unique’ существует в поле (ine).
Хранимая процедура заключается в следующем:
delimiter ##
create procedure sp_aperturaCuenta(
IN p_nombre varchar(30),
in p_apellidoPaterno varchar (30),
in p_ine varchar (12),
in p_cuenta int,
in p_saldoApertura double,
in p_sucursal varchar (30)
)
be&in
declare id int;
declare fallo boolean default 0;
declare continue handler for sqlexception
be&in
set fallo = 1;
end;
start transaction;
insert into persona (nombre, apPaterno, ine) values (p_nombre,p_apellidoPaterno, p_ine);
set id = last_insert_id();
insert into cliente values (p_cuenta,p_saldoApertura, curdate(), p_sucursal, id );
if fallo = 0 then
commit;
else
rollback;
end if;
end ##
delimiter ;
Вот вызовы процедуры:
Call sp_aperturaCuenta('Carlos','Montes','12302002120',1121,1000,'Delta');
Call sp_aperturaCuenta('Carlos','Montes','12302002120',1231,5000,'Delta');
Как можно видеть, единственная разница между одним вызовом и другим заключается в том, что учетная запись отличается. И я не могу вставить вторую.
Ответ №1:
Чтобы добавить вторую cliente
запись к существующей persona
, переименуйте свою id
переменную в v_id
:
declare v_id int;
Затем попробуйте выполнить поиск persona
по ine
и вставить только в том случае, если вы не можете найти запись.
select id into v_id from persona where ine = p_ine;
if v_id is null then
insert into persona (nombre, apPaterno, ine) values (p_nombre,p_apellidoPaterno, p_ine);
set v_id = last_insert_id();
end if;
insert into cliente values (p_cuenta,p_saldoApertura, curdate(), p_sucursal, v_id );
Ответ №2:
Ограничение уникальности является ограничением по определенной причине, и RBDMS отлично справляются с ограничениями.
Пока у вас есть уникальное ограничение в определении таблицы, столбец, для которого определено уникальное ограничение, не может иметь несколько равных значений.
Единственный способ обойти ограничение — это удалить его, чего я не предлагаю, если это противоречит требованиям к дизайну вашей базы данных.