Mysql
 sql >> база данни >  >> RDS >> Mysql

PHP + MYSQL при дублиран КЛЮЧ все още увеличават ИНДЕКСНИЯ КЛЮЧ

добре, да, сега се сещам за този проблем. Веднъж имаше един човек, който искаше да прави вмъквания, но всяко вмъкване трябваше да бъде на стъпки от 100 ако можете да си представите, започвайки @1000. И ние трябваше да опаковаме цялото нещо в съхранена процедура, за да имаме едно място на уязвимост. Вашият проблем се появи и той отхвърли номерирането му с 1 или нещо такова.

Като го опаковаме, бихме могли разумно да имаме една точка да го направим, със заключване, и да поддържаме стойността auto_inc с ALTER TABLE

Другият подход, който му казах, е да имаш таблица за увеличаване, да заключиш 1 ред, да получиш стойността в този ред, да я използваш, да актуализираш тази incTable със 100. отключи.

През цялото време се смеехме на проблемите с ОКР. Мисля, че харесваше само кратни на 10, т.н.

Редактиране:

Схема:

-- 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;

Съхранена процедура:

-- 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
$$

Тест:

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 |
+----+----------------------+---------+---------------------+

От частта Mysql INNODB на Ръководство :

Ще ме видите ли да използвам това, вероятно не. Просто го показвам. Добре съм с пропуските и спя през нощта. Ето защо нарекох първата таблица това, което направих :>



  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 JOIN връща NULL полета

  2. Как мога да избера всички данни от таблица с условие?

  3. Как да получите първи запис във всяка група в MySQL

  4. Таблицата е твърде широка, за да се побере в PDF, генериран от Markdown

  5. База данни срещу JSON срещу вградени бази данни