gpt4 book ai didi

mysql - 避免存储过程中重复条目的逻辑条件

转载 作者:行者123 更新时间:2023-11-30 23:03:13 24 4
gpt4 key购买 nike

我有以下存储过程。我正在尝试将表 usuaris 中的用户插入到存储过程创建的表中,该表的名称为(nombre varchar(50)),传递为一个参数。

调用该过程时,它会复制 id 4 的用户“mary”。我已经尝试了几种方法来实现逻辑条件以避免重复,但仍然,我遗漏了一些东西,无法得到想要的结果。在下面的代码中,插入之前的逻辑条件是我最后尝试过的。有什么想法吗?

谢谢。

 CREATE DEFINER=`root`@`localhost` PROCEDURE `createNewtable`(nombre varchar(50))
BEGIN

/*variable declaration*/

declare centinela int ;
declare id1 int ;
declare nom1 varchar(50);
declare admin1 enum('0','1') ;

declare cadena varchar(100); /*string to concatenate table creation and insertion*/


/*cursor declaration*/

declare cursor1 cursor for select * from users.usuaris where admin = '1' ;
declare continue handler for not found set @centinela = 1 ;


/*create the table with the name that's passed as parameter*/

set @cadena=concat("create table ",nombre,
"(
id2 int not null primary key,
nom2 varchar(50),
admin2 enum ('0','1')
)" );

prepare stmt from @cadena ;
execute stmt ;
deallocate prepare stmt;


/* loop that fetches the data from the table usuaris and
inserts them into the newly created table. */

set @centinela = 0 ;
open cursor1 ;

bucle: loop
fetch cursor1 into id1,nom1,admin1 ;

if ( centinela = 1 ) then
leave bucle ;
end if ;

/*logic condition to avoid entry duplication */

if not exists (select * from users.usuaris where admin='1' and id=@id1) then
set @cadena=concat("insert into ",nombre," values( ",id1,",'",nom1,"','",admin1,"')");
end if;

select @cadena;
prepare stmt from @cadena;
execute stmt ;
deallocate prepare stmt;

end loop bucle;
close cursor1;

END

这里是用户的单表数据库:

 create database if not exists `users` ;

use `users` ;

create table usuaris(

id int not null auto_increment primary key ,
nom varchar(50),
admin enum ('0','1')

);


insert into usuaris(id,nom,admin)
values
(1,'jose','1'),
(2,'maria','0'),
(3,'frank','1'),
(4,'mary','1'),
(5,'godfrey','0') ;

最佳答案

它还必须复制jose。重复的原因 - 如果 IF 语句不是 TRUE 那么你不设置新的 @cadena 变量但是无论如何执行 PREVIOUS @cadena 声明。您还应该将执行移到 IF 语句中:

   if not exists (select * from users.usuaris where admin='1' and id=@id1) then
set @cadena=concat("insert into ",nombre," values( ",id1,",'",nom1,"','",admin1,"')");
select @cadena;
prepare stmt from @cadena;
execute stmt ;
deallocate prepare stmt;
end if;

此外,在 SQL 中,如果可能,您应该始终尽量避免循环,并改用 SQL 语句。您可以用一个 SQL 语句替换循环:

INSERET INTO NEW_TABLE_NAME_HERE 
SELECT id1,nom1,admin1
FROM users.usuaris where admin<>'1'

此外,您还可以使用 SELECT INTO 语句语法自动创建新表,而无需 CREATE TABLE 语句:

    SELECT id1 as id2,
nom1 as nom2,
admin1 as admin2
INTO NEW_TABLE_NAME_HERE
FROM users.usuaris where admin<>'1'

关于mysql - 避免存储过程中重复条目的逻辑条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23011272/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com