2017-03-13 3 views
0

Wie ignoriere ich automatisch erhöhte primäre ID auf myIsam Einfügen ignorieren? Wie löst man dieses Problem? Dies ist schnell primäre ID erhöht. Wie lösen diesesWie Ignoriere automatisch erhöhte primäre ID auf myIsam Einfügen ignorieren?

MY TABLE STRUKTUR

| dates_tbl | CREATE TABLE `dates_tbl` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `date_raw` int(8) unsigned NOT NULL DEFAULT '0', 
    `date` date NOT NULL DEFAULT '0000-00-00', 
    `day` tinyint(2) unsigned NOT NULL DEFAULT '0', 
    `week` tinyint(2) unsigned NOT NULL DEFAULT '0', 
    `month` tinyint(2) unsigned NOT NULL DEFAULT '0', 
    `year` year(4) NOT NULL DEFAULT '0000', 
    `created_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `modified_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `date_raw_unique` (`date_raw`), 
    KEY `date_raw` (`date_raw`), 
    KEY `month_year` (`month`,`year`), 
    KEY `year` (`year`) 
) ENGINE=InnoDB AUTO_INCREMENT=21628 DEFAULT CHARSET=latin1 | 

INSERT QUERY

$q = "INSERT IGNORE INTO dates_tbl(date_raw,date,day,week,month,year,created_on) 
values $dynamic_value"; 

RESULT

mysql> select id from dates_tbl limit 10; 
+-------+ 
| id | 
+-------+ 
| 19657 | 
| 19681 | 
| 19729 | 
| 19777 | 
| 19825 | 
| 19873 | 
| 19884 | 
| 19913 | 
| 19960 | 
| 20007 | 
+-------+ 
10 rows in set (0.01 sec) 
+0

Was soll diese Tabelle darstellen? – duskwuff

Antwort

0
  • Die Tabelle ist InnoDB, warum erwähnen Sie MyISAM?
  • id loswerden, dient es wahrscheinlich keinen Zweck. Unterstützen Sie stattdessen date_raw als PRIMARY KEY.
  • Vermeiden Sie redundante Indizes - ein PRIMARY KEY ist ein UNIQUE KEY ist ein KEY.
  • In der Regel ist es besser, Jahr + Monat + Tag in einer einzigen DATE Spalte zu halten, dann wählen Sie sie bei Bedarf aus.
  • Verwenden Sie tatsächlich created_on und modified_on? Oder ist das ein Artefakt einer Drittanbieter-Software?
  • Es ist effizienter, einen Index für eine DATE zu haben, dann
  • so etwas wie verwenden

dieses:

WHERE ymd >= '2010-03-01' 
    AND ymd < '2010-03-01' + INTERVAL 1 MONTH 

Mit diesen Änderungen haben Sie die Hälfte der Spalten und die meisten der Indizes eliminiert. Und die INSERT IGNORE wird aufhören, Ihnen Probleme zu geben.

Wenn Sie die AUTO_INCREMENT behalten, dann sehen wir uns etwas mehr von der Logik - müssen sehen, warum IGNORE tritt in Kraft. Die Lösung kann einen Teil des anderen Codes zusätzlich zu dem INSERT enthalten.

Dies ist Teil eines Stern-Schemas in Data Warehousing, dann werde ich darüber schwadronieren, wie es schlecht ist, "kontinuierliche" Werte zu normalisieren, wie DATE. An diesem Punkt verschwindet der ganze Tisch. Und der Code wird schneller laufen!

Verwandte Themen