/ / obsłużyć wiele wierszy w wyzwalaczu PRZED WEWNĄTRZ WSTAW podczas wstawiania wielu wierszy za pomocą pojedynczego zapytania SQL - mysql, sql-server, wyzwalacze

obsłużyć wiele wierszy wyzwaniem PRZED WEWNĄTRZ WSTAW podczas wstawiania wielu wierszy za pomocą pojedynczego zapytania SQL - mysql, sql-server, wyzwalacze

mam UŻYTKOWNIK tabela z "id" i "name" columns.there jest PRODUKT tabela z kolumnami "id" i "user_id". "user_id" kolumna ma odniesienie do klucza obcego do kolumny "id" w UŻYTKOWNIK table.when wstawiania wielu wierszy za pomocą pojedynczego zapytania sql, który ma ten sam user_id.like

INSERT INTO PRODUCT(id,user_id) VALUES(1,1),(2,1),(3,1),(4,1);

Chcę wykonać przed włączeniem spustu dla uchwyt poniżej warunków.

  • w tabeli PRODUKT uzyskaj liczbę wierszy, które mają takie same odniesienia do kluczy obcych, co w przypadku wstawiania rekordów "klucz obcy".
  • jeśli powyżej liczby większej lub równej trzy., aby wstawić wszystkie wiersze.
  • jeśli powyższa liczba to 0, a liczba surowców, które próbują wstawić, jest większa lub równa trzy, wtedy zezwól na wstawienie wszystkich surowców.
  • jeśli powyższy numer to 0, a liczba surowców, które próbujesz wstawić, jest mniejsza niż trzy, wtedy nie zezwalaj na wstawianie wszystkich surowców i wysyłanie komunikatu o błędzie.

Czy ktoś może mi pomóc napisać wyzwalacz PRZED WSTAW, aby obsłużyć wszystkie te warunki?

Odpowiedzi:

1 dla odpowiedzi № 1

Możesz użyć lewostronnego połączenia i liczyć na istniejąceWpisy do osiągnięcia tylko wstawiania wpisów, gdy jest już 3 lub więcej rekordów już przechowywanych lub insert ma co najmniej trzy rekordy do wstawienia dla identyfikatora użytkownika.

    CREATE TABLE if not exists `product_46353892` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

/*
truncate table to allow rerun of example
*/
truncate product_46353892 ;

/*
example showing no inserts since there are only two records being inserted
and no previous records for this user_id
*/
insert into product_46353892 ( id, user_id )
select `new`.*
-- , new_count.count new_count
-- , old.count old_count
from (
select 1 id, 1 user_id
union all
select 2 id, 1 user_id
) `new`
left join (
select user_id, count(*) count from (
select 1 id, 1 user_id
union all
select 2 id, 1 user_id
) new_group
group by user_id
) new_count
on `new`.user_id = new_count.user_id
left join (
select user_id, count(*) count from product_46353892 product
group by user_id
) old
on new.user_id = old.user_id
where ( new_count.count >= 3 or old.count >= 3 or ( new_count.count + old.count ) >= 3 ) ;


/*
this one works because there are three or more records in the insert
*/
insert into product_46353892 ( id, user_id )
select `new`.*
from (
select 3 id, 1 user_id
union all
select 4 id, 1 user_id
union all
select 5 id, 1 user_id
union all
select 6 id, 1 user_id
) `new`
left join (
select user_id, count(*) count from (
select 3 id, 1 user_id
union all
select 4 id, 1 user_id
union all
select 5 id, 1 user_id
union all
select 6 id, 1 user_id
) new_group
group by user_id
) new_count
on `new`.user_id = new_count.user_id
left join (
select user_id, count(*) count from product_46353892 product
group by user_id
) old
on new.user_id = old.user_id
where ( new_count.count >= 3 or old.count >= 3 or ( new_count.count + old.count ) >= 3 ) ;


/*
this now works since there are already the required number of initial records stored
for this user_id
*/
insert into product_46353892 ( id, user_id )
select `new`.*
-- , new_count.count new_count
-- , old.count old_count
from (
select 1 id, 1 user_id
union all
select 2 id, 1 user_id
) `new`
left join (
select user_id, count(*) count from (
select 1 id, 1 user_id
union all
select 2 id, 1 user_id
) new_group
group by user_id
) new_count
on `new`.user_id = new_count.user_id
left join (
select user_id, count(*) count from product_46353892 product
group by user_id
) old
on new.user_id = old.user_id
where ( new_count.count >= 3 or old.count >= 3 or ( new_count.count + old.count ) >= 3 ) ;


select * from product_46353892 ;

Przykładowe wyniki. Zauważ, że kolejność identyfikatorów, 1 i 2 została wstawiona do drugiej wkładki po tym, jak w tabeli były już trzy lub więcej rekordów dla identyfikatora użytkownika.

id  user_id
3   1
4   1
5   1
6   1
1   1
2   1