INSERT-Kontrolle bei MySQL

xrax

Erfahrenes Mitglied
Hallo zusammen,

wir haben das "Phänomen" bei einer unserer Tabellen das bei dieser der PK immer wieder stark ansteigt.

Die Spalte des PK ist auto_increment und wer mit seinem Code auf diese Spalte zugreift ist sich sichter auf diese Spalte keinen Schreibbefehl auszulösen.
Trotzdem haben wir nicht wie gewohnt ein hochzählen um jeweils eins im PK.
Sondern wir haben Sprünge um mehrere tausend.

Wie kann ich nun herausfinden wo dieser Fehler herkommt ?
Ich würde gerne die Query sehen die diese hochzählen veranlasst.
Kann ich das nur für diese eine Tabelle protokollieren ?

Besten Dank
xrax
 
Spielt ihr ev. mit transactions rum und macht dann ein rollback?
(weil ihr blos irgendwas testen wollt)

der interne zähler wird bei einem rollback nicht zurückgesetzt.
 
Hi,

du könntest einen Trigger aktivieren für INSERTs auf diese Tabelle. Im Trigger kannst du prüfen, ob für die Spalte, die den PK darstellt, ein Wert vorgegeben ist. Am besten wäre es, wenn du das dann in eine weitere temporäre Log-Tabelle protokollierst:

Code:
CREATE TABLE `datatable` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `content1` VARCHAR(45) NULL,
  `content2` DATETIME NULL,
  PRIMARY KEY (`id`));

CREATE TABLE `test`.`checktable` (
  `idchecktable` INT NOT NULL AUTO_INCREMENT,
  `pk_for_origin` INT NULL,
  `insert_date` TIMESTAMP NULL,
  PRIMARY KEY (`idchecktable`));

DELIMITER |
CREATE TRIGGER `checktrigger` BEFORE INSERT ON `datatable`
FOR EACH ROW BEGIN
  INSERT INTO `checktable` (pk_for_origin, insert_date) VALUES (NEW.id, NOW());
END;
|

INSERT INTO `datatable` (`id`, `content1`, `content2`) VALUES (1000, 'test content 1', NOW());

Wobei du dann sogar nur auf den Fall reagieren kannst, wenn die ID vorgegeben ist:

Code:
DROP TRIGGER `checktrigger`; 

TRUNCATE `datatable`;
TRUNCATE `checktable`;

DELIMITER |
CREATE TRIGGER `checktrigger` BEFORE INSERT ON `datatable`
FOR EACH ROW BEGIN
  CASE WHEN NEW.id > 0 THEN
    INSERT INTO `checktable` (pk_for_origin, insert_date) VALUES (NEW.id, NOW());
  END CASE;
END;
|

INSERT INTO `datatable` (`content1`, `content2`) VALUES ('Schmarrn', NOW());
INSERT INTO `datatable` (`id`, `content1`, `content2`) VALUES (1000, 'Anderer Blödsinn', NOW());

Damit bekommst du zumindest schon mal die Zeit raus. Es könnte sogar möglich sein, den Prozess rauszufinden, der das verursacht:

http://dev.mysql.com/doc/refman/5.1/de/show-processlist.html

Spiel mal bisschen damit rum ;-)
 
Spielt ihr ev. mit transactions rum und macht dann ein rollback?
(weil ihr blos irgendwas testen wollt)

der interne zähler wird bei einem rollback nicht zurückgesetzt.

An sich spielt keiner rum.....
Das ist aber ne gute Idee, ich werd die Kollegen mal drauf ansprechen.
Hab schon einen im Auge .....
 
Kannst ja auch mal testen, ob das Setzen von NEW.id auf 0 im Trigger irgendwas bringt. Damit könntest du bspw. auschließen oder bestätigen, ob jemand Transaktionen öffnet und wieder zurück rollt.
 
Ein Kollege hat INSERT ....... ON DUPLICATE KEY UPDATE ..... verwendet.
Er sagt das dabei auch jeweils der PK hoch gezählt wird.

Danke für die Hilfe !
 
Der PK wird wie bei jedem INSERT eins hochgezählt, sofern der PK ein Feld vom Typ Autoinkrement ist.
 
Anscheinend auch nicht bei einem Rollback. Das war mir neu und ist auch ziemlich blöd.
Da kann ich INSERT ....... ON DUPLICATE KEY UPDATE ..... eigentlich nicht verwenden.
 
Zurück