Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

PHP + MYSQL trên KHÓA trùng lặp vẫn tăng KHÓA CHỈ SỐ

vâng vâng, bây giờ tôi nhớ vấn đề này. Có một chàng trai đã từng muốn thực hiện các lần chèn, nhưng mỗi lần chèn phải có số gia là 100 nếu bạn có thể tưởng tượng, bắt đầu từ @ 1000. Và chúng tôi đã phải gói toàn bộ mọi thứ trong một proc được lưu trữ để có một nơi dễ bị tổn thương. Vấn đề của bạn nổi lên và nó đã làm mất đi số thứ tự của anh ấy bằng 1 hoặc lâu hơn.

Bằng cách gói nó, chúng ta có thể thực hiện một cách thuần thục, với một khóa và duy trì giá trị auto_inc bằng ALTER TABLE

Cách tiếp cận khác mà tôi đã nói với anh ta là có một bảng tăng dần, khóa 1 hàng, lấy giá trị trong hàng đó, sử dụng nó, cập nhật bảng incTable đó bằng 100. mở khóa.

Toàn bộ thời gian chúng tôi đã cười về các vấn đề OCD. Tôi nghĩ anh ấy chỉ thích bội số của 10 thôi, idk

Chỉnh sửa:

Lược đồ:

-- 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 được lưu trữ:

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

Kiểm tra:

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

Từ phần Mysql INNODB của Hướng dẫn sử dụng :

Bạn sẽ thấy tôi sử dụng cái này, có lẽ là không. Chỉ hiển thị nó. Tôi ổn với khoảng trống và ngủ vào ban đêm. Đó là lý do tại sao tôi đặt tên cho bảng đầu tiên là những gì tôi đã làm:>



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chênh lệch thời gian trung bình trong mysql

  2. Tại sao tập lệnh docker-entrypoint-initdb.d của tôi (như được chỉ định trong docker-compos.yml) không được thực thi để khởi tạo một phiên bản MySQL mới?

  3. Triển khai trang web ASP.NET trên máy chủ Linux

  4. Laravel 5:chạy di chuyển trên môi trường máy chủ, không phải cục bộ

  5. Sự khác biệt giữa MySQL KHÔNG ĐỦ và! =''