sql >> Database >  >> RDS >> Mysql

Oracle-reeksen equivalent in MySQL

Ik heb dit probleem kunnen oplossen door de suggesties van @Akina en @RickJames te combineren, allebei bedankt voor hun steun.

create table my_seq(
min_value integer,
Max_value integer,
last_value integer,
increment_by tinyint,
customer_id integer)ENGINE = InnoDB;

Hier ENGINE=InnoDB is erg belangrijk. Om ervoor te zorgen dat er tijdens het lezen een vergrendeling op tafelniveau is, heb ik mijn app-code gewijzigd in:

Auto-Commit=FALSE

Dan,

//very import to begin the transaction
begin;
select last_number from my_seq where customer_id=? FOR UPDATE;

Read the result in App.

update my_seq set last_number=last_number+1 where customer_id=?;
commit;

Dit genereerde het unieke sequence number zelfs in het geval van meerdere gelijktijdige sessies.

Ik heb een ander probleem ondervonden, dat deze oplossing is vertraagd, andere zijn waar ik sequence# genereer. Ik heb het opgelost door een vergrendeling op rijniveau in plaats van tabelniveauvergrendeling in te schakelen door customer_id te indexeren.

ALTER TABLE TABLE_NAME ADD INDEX (customer_id);

Ik hoop dat dit een volledige hulp is voor anderen.




  1. NULL-parameters niet toestaan ​​voor opgeslagen procedures in MySQL/MariaDB

  2. SQLSTATE [HY000] [1045] uitzondering tijdens verbinding met database via 000webhost

  3. Converteer Select Oracle Query naar update voor specifiek scenario

  4. hoe variabele van shellscript door te geven aan sqlplus