我前段时间实施了这个解决方案。 https://stackoverflow.com/a/12657012/112680
它一直很好,直到昨天。我添加了几个列,我相信一个索引(我在没有问题之前就完成了),现在它没有像1,2,3 eventid
那样进行修改,它只是为每一个增加行。
我从工作中做了一个比较,除了自动增量起始值之外我没有看到任何差异。
主表上的我之后插入触发器
thisTrigger: BEGIN
IF ((@TRIGGER_CHECKS = FALSE)
OR (@TRIGGER_AFTER_INSERT_CHECKS = FALSE))
AND (USER() = xxx)
THEN
LEAVE thisTrigger;
END IF;
INSERT INTO eventshistory
SELECT 'initial booking', NULL, UTC_TIMESTAMP(), e.*
FROM events AS e
WHERE e.eventid = NEW.eventid;
END
更新触发后
thisTrigger: BEGIN
IF ((@TRIGGER_CHECKS = FALSE)
OR (@TRIGGER_AFTER_UPDATE_CHECKS = FALSE))
AND (USER() = xxxx)
THEN
LEAVE thisTrigger;
END IF;
INSERT INTO eventshistory SELECT 'update', NULL, UTC_TIMESTAMP(), e.*
FROM events AS e WHERE e.eventid = NEW.eventid;
END
DDL
CREATE TABLE eventshistory (
action VARCHAR(15) NOT NULL DEFAULT 'insert'
,revision INT(6) NOT NULL AUTO_INCREMENT
,actiondate DATETIME DEFAULT NULL
,eventid INT(11) NOT NULL
,franchiseid INT(11) NOT NULL
,territoryid INT(11) DEFAULT NULL
,customerinfoid INT(11) DEFAULT NULL
,eventaddressid INT(11) DEFAULT NULL
,eventstartdate DATETIME DEFAULT NULL
,eventenddate DATETIME DEFAULT NULL
,createdon DATETIME DEFAULT NULL
,createdby INT(11) DEFAULT NULL
,updatedon DATETIME DEFAULT NULL
,updatedby INT(11) DEFAULT NULL
,attendeecount SMALLINT(6) DEFAULT NULL
,onhold TINYINT(1) NOT NULL DEFAULT 0
,holduntildate DATETIME DEFAULT NULL
,canceledon DATETIME DEFAULT NULL
,canceledby INT(11) DEFAULT NULL
,isquotesent TINYINT(1) NOT NULL DEFAULT 0
,quoteexpireson DATETIME DEFAULT NULL
,haspriceoverride TINYINT(1) NOT NULL DEFAULT 0
,pretaxtotal DECIMAL(8,2) DEFAULT NULL
,couponcodeid INT(11) DEFAULT NULL
,eventnotes VARCHAR(500) DEFAULT NULL
,discounttype CHAR(1) DEFAULT NULL COMMENT 'P for percentage, F for fixed dollar'
,discountamount DECIMAL(8,2) DEFAULT NULL
,istaxexempt TINYINT(1) NOT NULL DEFAULT 0
,videogameratingid INT(11) DEFAULT NULL
,quotedon DATETIME DEFAULT NULL
,tax DECIMAL(8,2) DEFAULT NULL
,receiptnotes VARCHAR(500) DEFAULT NULL
,outstandingbalance DECIMAL(8,2) DEFAULT NULL
,flatparkingsetup TINYINT(1) DEFAULT NULL
,honoreename VARCHAR(50) DEFAULT NULL
,HonoreeAge VARCHAR(10) DEFAULT NULL
,honoreegender CHAR(1) DEFAULT NULL
,referralsourceid INT(11) DEFAULT NULL
,eventtypeid INT(11) DEFAULT NULL
,pricingmodel CHAR(11) DEFAULT NULL COMMENT 'Hourly 1, Hourly 2 etc.'
,depositamt DECIMAL(8,2) DEFAULT NULL
,isquoteconverted TINYINT(1) DEFAULT NULL
,status VARCHAR(25) DEFAULT NULL
,activitiestotal DECIMAL(8,2) DEFAULT NULL
,coupontotal DECIMAL(8,2) DEFAULT NULL
,overridediff DECIMAL(8,2) DEFAULT NULL
,refunddue DECIMAL(8,2) DEFAULT NULL
,bookeddate DATETIME DEFAULT NULL
,cancelationfee DECIMAL(8,2) DEFAULT NULL
,eventtotal DECIMAL(8,2) DEFAULT NULL
,discounttotal DECIMAL(8,2) DEFAULT NULL
,g2uwareeid INT(11) DEFAULT NULL
,islocked TINYINT(1) DEFAULT NULL
,lockeddate DATETIME DEFAULT NULL
,isQuotePaid TINYINT(1) DEFAULT NULL
,taxrate DECIMAL(6,5) DEFAULT 0.00000
,quotepaidpct TINYINT(4) UNSIGNED DEFAULT NULL
,cancelationfeecash DECIMAL(8,2) DEFAULT NULL
,canceltype CHAR(1) DEFAULT NULL
,isguaranteed TINYINT(1) DEFAULT 0
,commission DECIMAL(6,2) DEFAULT 0.00
,commissionreportedbooked TINYINT(1) NOT NULL DEFAULT 0
,commissionreportedcompleted TINYINT(1) NOT NULL DEFAULT 0
,CommissionableCost DECIMAL(8,2) NOT NULL DEFAULT 0.00
,CouponType CHAR(1) DEFAULT NULL
,CouponCode VARCHAR(25) DEFAULT NULL
,CouponAmount DECIMAL(6,2) DEFAULT NULL
,PRIMARY KEY (eventid,revision)
,INDEX IDX_eventshistory_franchiseid (franchiseid)
,INDEX UK_eventshistory (status)
,INDEX UK_eventshistory2 (canceledon)
,INDEX UK_eventshistory3 (revision,eventid,franchiseid)
)
ENGINE = MYISAM
AUTO_INCREMENT = 235
AVG_ROW_LENGTH = 251
CHARACTER SET utf8
COLLATE utf8_unicode_ci;
答案 0 :(得分:0)
所以,RTM ...... https://dev.mysql.com/doc/refman/5.7/en/example-auto-increment.html
如果AUTO_INCREMENT列是多个索引的一部分,则MySQL使用以AUTO_INCREMENT列开头的索引(如果有)生成序列值。例如,如果animals表包含索引PRIMARY KEY(grp,id)和INDEX(id),则MySQL将忽略PRIMARY KEY以生成序列值。因此,表格将包含单个序列,而不是每个grp值的序列。
我刚刚添加了一个包含PK的新索引。
同样,对于auto increment
重置,MySQL会为MyISAM
指定
您无法将计数器重置为小于或等于任何已使用过的值。对于MyISAM,如果该值小于或等于AUTO_INCREMENT列中当前的最大值,则该值将重置为当前最大值加一
但是当我把它重置为1000时,它实际上把它重新设置为1.所以这是个好消息。