Изявление за условно вмъкване или актуализиране на SQL в зависимост от двойка колони. Използване на уникален индекс?

Добре, така че имам таблица (в моята база данни MySQL), както следва:

CREATE TABLE IF NOT EXISTS `funddata` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ticker` varchar(128) NOT NULL,
  `price_date` date NOT NULL,
  `price` double NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=0 ;

И някои примерни данни:

INSERT INTO funddata (ticker, price_date, price) VALUES ("tick1", '2013-06-01', 36.2);
INSERT INTO funddata (ticker, price_date, price) VALUES ("tick2", '2013-06-01', 14.7);
INSERT INTO funddata (ticker, price_date, price) VALUES ("tick3", '2013-06-01', 102.5);
INSERT INTO funddata (ticker, price_date, price) VALUES ("tick1", '2013-07-01', 38.7);
INSERT INTO funddata (ticker, price_date, price) VALUES ("tick2", '2013-07-01', 16.2);

Сега да кажем, че искам да добавя още цени за tick1. Ако цената, която искам да добавя, вече съществува в моята таблица за тази дата, тогава искам да актуализирам какво има там с новата цена, в противен случай просто искам да я вмъкна като нов запис.

Има ли смисъл да се прави уникален индекс от (ticker, price_date), като се има предвид, че няма 2 записа, които трябва да споделят един и същ тикер и дата? Ако е така, как бих направил това и как бих използвал такъв индекс.


person harryg    schedule 06.09.2013    source източник
comment
можете да създадете първичен ключ на (идентификатор и дата) и да използвате вмъкване при актуализация на дублиран ключ   -  person danisius    schedule 06.09.2013
comment
Нормализиране на вашия db е още по-добре.   -  person Mihai    schedule 06.09.2013


Отговори (1)


CREATE UNIQUE INDEX index_name ON funddata(priceDate, price); 

След това използвайте INSERT... ON DUPLICATE KEY UPDATE

Но все пак това нарушава първата нормална форма.http://en.wikipedia.org/wiki/First_normal_form

person Mihai    schedule 06.09.2013
comment
Благодаря за отговора, трябва ли всъщност да направя индекса на ticker и price_date? Както може да има записи, които споделят една и съща цена и дата, но всяка дата трябва да се появява само веднъж на тикер. напр. tick1 трябва да има само един запис за 2013-06-01... - person harryg; 09.09.2013
comment
Освен това, от четене за 1-вата нормална форма, не вярвам, че този метод я нарушава, тъй като все още има само 1 атомна стойност във всяко поле; Не се опитвам да разделям полетата на части. - person harryg; 09.09.2013