ठीक है, हाँ, अब मुझे यह मुद्दा याद है। एक बार एक आदमी था जो इन्सर्ट करना चाहता था, लेकिन प्रत्येक इंसर्ट को 100
के इंक्रीमेंट में होना चाहिए था। अगर आप सोच सकते हैं, @1000 से शुरू। और हमें भेद्यता की एक जगह रखने के लिए पूरी चीज को एक संग्रहित प्रो में लपेटना पड़ा। आपकी समस्या सामने आई और इसने उसकी संख्या 1 या उससे भी कम कर दी।
इसे लपेटकर, हम समझदारी से इसे करने का एक बिंदु प्राप्त कर सकते हैं, लॉक के साथ, और auto_inc मान को ALTER TABLE
के साथ बनाए रख सकते हैं
दूसरा तरीका जो मैंने उनसे कहा वह था एक इंक्रीमेंटर टेबल, 1 रो को लॉक करना, उस रो में वैल्यू पाना, उसका इस्तेमाल करना, उस इंकटेबल को 100 तक अपडेट करना। अनलॉक।
पूरे समय हम ओसीडी के मुद्दों पर हंसते रहे। मुझे लगता है कि उसे केवल 10 के गुणज पसंद थे, idk
संपादित करें:
स्कीमा:
-- 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 भाग से :
क्या आप मुझे इसका इस्तेमाल करते हुए देखेंगे, शायद नहीं। दिखा ही रहा है। मैं अंतराल के साथ ठीक हूँ और रात को सो रहा हूँ। यही कारण है कि मैंने जो किया वह पहली तालिका का नाम दिया :>