Mysql
 sql >> Baza danych >  >> RDS >> Mysql

PHP + MYSQL na Duplicate KEY nadal zwiększają INDEX KEY

ok tak, teraz pamiętam ten problem. Był kiedyś facet, który chciał robić wstawki, ale każda wstawka musiała być w przyrostach o 100 jeśli możesz sobie wyobrazić, zaczynając od @1000. Musieliśmy owinąć całość w zapisany proces, aby mieć jedno miejsce podatności. Twój problem pojawił się i wyrzucił jego numerację o 1.

Zawijając go, moglibyśmy mieć jeden punkt, aby to zrobić, z blokadą i utrzymać wartość auto_inc za pomocą ALTER TABLE

Inne podejście, o którym mu powiedziałem, to mieć tabelę inkrementacyjną, zablokować 1 wiersz, pobrać wartość w tym wierszu, użyć jej, zaktualizować tę incTable o 100. odblokuj.

Cały czas śmialiśmy się z problemów z OCD. Myślę, że lubił tylko wielokrotności 10, nie wiem

Edycja:

Schemat:

-- drop table ocd_nextnums;
create table ocd_nextnums
(   -- id table for nextnum, for the OCD impaired
    tableName varchar(100) not null,
    nextnum int not null
    -- won't bother with indexes, go for it if you want
)engine=INNODB; -- note engine type

insert ocd_nextnums(tableName,nextnum) values('thing',1);
insert ocd_nextnums(tableName,nextnum) values('some_other_table',1);

-- drop table thing;
create table thing
(   id int primary key, -- NOT an auto_increment, but is a PK
    email varchar(100) not null,
    version varchar(20) not null,
    lastupdate datetime not null,
    UNIQUE KEY (email)
)engine=MyIsam;

Przechowywany proces:

-- drop procedure putInThing;
delimiter $$
create procedure putInThing
(
    email_In varchar(100), version_In varchar(20)
)
BEGIN
    declare toUse int;
    declare theCount int;

    select count(*) into theCount from thing where email=email_In;
    select id into toUse from thing where email=email_In;   -- useful for result set @end
    IF theCount=1 THEN
        -- was there, do UPDATE
        update thing set version=version_In,lastupdate=now() where email=email_In;
    ELSE
        -- new row, do INSERT (please note the FOR UPDATE clause)
        select nextnum into toUse from ocd_nextnums where tableName='thing' FOR UPDATE;
        update ocd_nextnums set nextnum=nextnum+1 where tableName='thing';

        insert thing(id,email,version,lastupdate) values (toUse,email_In,version_In,now());
    end if;
    select toUse;   -- <------- that was your id
END
$$

Test:

call putInThing('[email protected]','111');
call putInThing('[email protected]','121');
call putInThing('[email protected]','107');
select * from thing;
+----+----------+---------+---------------------+
| id | email    | version | lastupdate          |
+----+----------+---------+---------------------+
|  1 | [email protected] | 111     | 2015-08-14 17:08:10 |
|  2 | [email protected] | 121     | 2015-08-14 17:08:54 |
|  3 | [email protected] | 107     | 2015-08-14 17:08:56 |
+----+----------+---------+---------------------+

call putInThing('[email protected]','101111007'); -- is an update
call putInThing('[email protected]','42'); -- is an update
call putInThing('[email protected]','10007'); -- is an update
call putInThing('[email protected]','1'); -- is an insert

select * from thing;
+----+----------------------+---------+---------------------+
| id | email                | version | lastupdate          |
+----+----------------------+---------+---------------------+
|  1 | [email protected]             | 111     | 2015-08-14 17:08:10 |
|  2 | [email protected]             | 121     | 2015-08-14 17:08:54 |
|  3 | [email protected]             | 10007   | 2015-08-14 17:22:09 |
|  4 | [email protected] | 1       | 2015-08-14 17:22:47 |
+----+----------------------+---------+---------------------+

Z części Mysql INNODB Podręcznik :

Czy zobaczysz mnie używającego tego, prawdopodobnie nie. Po prostu to pokazuję. Jestem w porządku z lukami i spaniem w nocy. Dlatego nazwałem pierwszy stół tym, co zrobiłem :>



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL odpowiednik modułu dblink w PostgreSQL?

  2. Jak porównywać wydajność MySQL za pomocą SysBench?

  3. Jak naprawić alert Security Advisor MySQL?

  4. Jak napisać pełne zapytanie indeksu wyszukiwania, które nie będzie brać pod uwagę żadnych odrzucanych słów?

  5. Używasz warstwy bazy danych Django poza Django?