Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

PHP + MYSQL pada KUNCI Duplikat masih meningkatkan KUNCI INDEKS

ok ya, sekarang saya ingat masalah ini. Pernah ada seorang pria yang ingin melakukan penyisipan, tetapi setiap penyisipan harus dalam kelipatan 100 jika Anda bisa membayangkan, mulai @1000. Dan kami harus membungkus semuanya dalam proc yang tersimpan untuk memiliki satu tempat kerentanan. Masalah Anda muncul dan membuat penomorannya menjadi kurang lebih 1 atau lebih.

Dengan membungkusnya, kita bisa memiliki satu tujuan untuk melakukannya, dengan kunci, dan mempertahankan nilai auto_inc dengan ALTER TABLE

Pendekatan lain yang saya katakan kepadanya adalah memiliki tabel penambah, kunci 1 baris, dapatkan nilai di baris itu, gunakan, perbarui incTable itu dengan 100. buka kunci.

Sepanjang waktu kami menertawakan masalah OCD. Saya pikir dia menyukai kelipatan 10 saja, idk

Sunting:

Skema:

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

Proc Tersimpan:

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

Uji:

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

Dari bagian INNODB Mysql dari Manual :

Apakah Anda akan melihat saya menggunakan ini, mungkin tidak. Hanya menunjukkannya. Saya baik-baik saja dengan celah dan tidur di malam hari. Itulah sebabnya saya menamai tabel pertama apa yang saya lakukan :>



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengapa kita perlu menggunakan Kunci Asing?

  2. Pilih hanya nilai unik dari kolom di codeigniter

  3. Menetapkan xml yang dihasilkan oleh loop sementara ke variabel

  4. Bagaimana saya bisa tahu berapa banyak kueri yang diaktifkan di database saya?

  5. Php :Ubah gumpalan menjadi file gambar