2014-01-16 6 views
3

У меня проблемы с моим java-приложением, либо я недостаточно знаю, либо это невозможно в простой форме. Я надеюсь, что это первый вариант так как я новичок.На дубликат ключа на основе двух столбцов

Это мой стол:

CREATE TABLE IF NOT EXISTS `evolution` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`product` varchar(50) NOT NULL, 
`quantity` double NOT NULL, 
`date` date NOT NULL, 
`operator` varchar(50) NOT NULL, 
PRIMARY KEY (`id`) 
) 

Я хочу, чтобы отслеживать некоторые продажи продукции по дате.

Что я хотел бы достичь такой: позволяет сказать, оператор вводит сегодня, 17.01.2014 продукт banana с количеством 4 .Later тот день, когда он будет вставлять apples с количеством 10 .Отель тот же день он вставит banana с количество 1 и apples с количеством 12.

Завтра он будет делать то же самое, вставить bananas с количеством 2, но на сегодняшний день 18.01.2014 .Это должно быть на новой строке, так как его тот же продукт, но на другую дату.

В этой ситуации, мне нужна своя база данных, чтобы сделать следующее: Проверьте, если banana был вставлен на 17.01.2014 .Ел нет, то вставить его с количеством 0+4. Если банана уже вставлена ​​на 17.01.2014, уточните количество 4+1.

На следующий день он проверит, был ли установлен banana на 18.01.2014. Если нет, вставьте его в количестве 2. Если да, обновите количество.

Итак: у меня не может быть ни одного из столбцов, уникальных, поскольку дата может быть одинаковой для apples и banana и то же самое для даты и, конечно же, количества.

Как я могу это достичь? я думал о нескольких способах, но это не очень эффективно:

  1. Select (product,date) from evolution where product=banana AND date=18.01.2014 Если это возвращает ничего, то я выполнит обновление. Если это ничего не возвращает, я буду исполнять вставку.

  2. Сделайте столбец product-date, который будет уникальным. В нем я вставлю, например, banana 17.01.2014. Это было бы проще, но мне не нравится этот путь, его грязный.

Все это было бы так просто, если я мог бы сделать что-то вроде двойной на дубликата key.Try и вставить banana and date .Затем, если комбинация уже существует, сделать обновление.

Чтобы сделать короче и проще понять:

Это справедливо:

+-------+----------+ 
|product|date  | 
+-------+----------+ 
|banana |17.01.2014| 
+-------+----------+ 
|banana |18.01.2014| 
+-------+----------+ 
|apples |17.01.2014| 
+-------+----------+ 
|apples |18.01.2014| 
+-------+----------+ 

Это не действует:

+-------+----------+ 
|product|date  | 
+-------+----------+ 
|banana |17.01.2014| 
+-------+----------+ 
|banana |17.01 2014| 
+-------+----------+ 
|banana |18.01.2014| 
+-------+----------+ 
|banana |18.01.2014| 
+-------+----------+ 

Таким образом, они (product и date) могут быть дубликатами но не вместе.

Извините за длинный пост ... Надеюсь, я не пропущу простой и чистый способ сделать это, но я просто могу и я надеюсь, что так, я новичок в программировании. Спасибо и хорошо провести ночь!

+1

Имейте уникальный ключ (продукт, дата)!?!?! – Strawberry

+1

Похоже, вы после уникального ограничения продукта и даты. Можно добавить его после факта или сделать его частью инструкции create table. Выполнение этого будет выглядеть следующим образом: «ALTER TABLE evolution ADD CONSTRAINT uc_product UNIQUE (продукт, дата)' – Durandal

ответ

2

звучит так, как будто вы хотите использовать составной ключ для продукта AND.

PRIMARY KEY (product, date) 

Композитные первичные ключи являются по существу способом определить уникальность вещи, используя более одного ключ. Например, если у вас есть магазин, который продал только молотки и гвозди, которые оба были синего или красного цвета, вы не могли бы определить те в БД, как молоток или синий, вы должны использовать оба

tool | color | quantity 
hammer blue  4 
hammer red  3 
nail  blue  1 
nail  red  6 

ваш PK здесь будет на инструменте и цвете.

+0

Не знал об этом, о составных ключах, мне нужно будет исследовать и вернуться сюда: D –

+4

Будет ли это id & date или product & date? – Durandal

+2

@MagicMan хороший catch. продукт. Я не достаточно хорошо читал вопрос, чтобы увидеть этот банан! = Id. Подумал, потому что он назвал свой ПК как id, что и был бананом. Спасибо btw – Brad

Смежные вопросы