Форум: "Базы";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];
ВнизПервичнй ключ по двум столбцам? Найти похожие ветки
← →
tytus (2006-08-21 14:17) [0]Доброго дня ВСЕМ! В таблице есть столбец MID (number) и MSoftName(varchar2(10)). Нужно, чтобы записи в таб. имели вид:
MID MSoftName
1 V-10
2 V-10
3 V-10
1 V-15
2 V-15
4 V-10
3 V-15
Подскажите как такое можно осуществить.
← →
Sergey13 © (2006-08-21 14:20) [1]> Подскажите как такое можно осуществить.
Создать таблицу, написать прогу для работы и набить данные. В чем проблема то?
← →
tytus (2006-08-21 14:23) [2]>[1]
Написал уже, набил данные. а значения MID - по порядку:1,2,3..7
а нужно, чтобы как см.выше.
← →
evvcom © (2006-08-21 14:23) [3]А чем обусловлена необходимость составного первичного ключа? Сделай его обычным из одного поля number, а на MID и MSoftName Unique повесь. А в остальном см. [1]
← →
evvcom © (2006-08-21 14:24) [4]> [2] tytus (21.08.06 14:23)
> а значения MID - по порядку:1,2,3..7
Ну дык, а ты их по-порядку не набирай, набирай как тебе надо.
← →
Sergey13 © (2006-08-21 14:30) [5]> [2] tytus (21.08.06 14:23)
> а значения MID - по порядку:1,2,3..7
Так какой порядок задал - такой и получаешь. Если не какой не задал - сервер (или что там у тебя) сам решает что за чем.
Порядок сортировки никакого отношения к первичным ключам не имеет.
← →
tytus (2006-08-21 14:40) [6]>All
Сделал первичный ключ по полю MID. Добавил поле MNN. Нужно след.:
MID MNN MSoftName
1 1 V-10
2 2 V-10
3 3 V-10
4 1 V-15
5 2 V-15
6 4 V-10
7 3 V-15
Как сие сделать? Значения поля MNN вводится пользователем не будут. Их нужно получать... не знаю как. Вот для MID создал тригер Before Insert. А как генерить значения поля MNN??
← →
Sergey13 © (2006-08-21 14:46) [7]> А как генерить значения поля MNN??
это волшебные слова надо знать. Начинаются они с имени сервера, а заканчиваются к концу рабочего дня.
> Их нужно получать... не знаю как.
А на хрена тогда ввел? Шоб было?
← →
tytus (2006-08-21 14:55) [8]>[7]
select t_seq.nextval into :New.MID from Dual;
← →
Sergey13 © (2006-08-21 14:58) [9]> [8] tytus (21.08.06 14:55)
Таки это Оракл. И 10 постов не прошло как выяснили это (хоть и не сказал ты, но я догадался). 8-)
Теперь обясняй, что надо и что не получается.
← →
tytus (2006-08-21 15:08) [10]>[9]
Извени, что не указал тип БД.
Нужна база по модулям оборудования (таблица инвентаризации).
Есть, к примеру, 10 типов модулей и к каждому модулю идет своя версия ПО (V-10, V-15 ..).
Так вот нужно иметь таблицу вида [6].
Тригер на получения след. значения первичного ключа для поля MID уже есть. Значение поля MNN, как я понимаю, нужно получать в функции, а затем функцию вызывать в вышеупомянутом тригере.
← →
Sergey13 © (2006-08-21 15:10) [11]> Значение поля MNN, как я понимаю, нужно получать в функции,
> а затем функцию вызывать в вышеупомянутом тригере.
А что за MNN? Какой в ём смысл то?
← →
tytus (2006-08-21 15:15) [12]>[11]
Вот так хочет мудрое начальство.
Чтобы каждый тип ПО для модуля имел свой порядок.
← →
Sergey13 © (2006-08-21 15:20) [13]> [12] tytus (21.08.06 15:15)
Ну дык объясни принцип организации порядка для модулей. Я не улавливаю пока.
← →
tytus (2006-08-21 15:22) [14]>[12]
MID MNN MSoftName
1 1 V-10
2 2 V-10
3 3 V-10
4 1 V-15
5 2 V-15
6 4 V-10
7 3 V-15
Я и сам не знаю нахрен это нужно, но так надо!
← →
Desdechado © (2006-08-21 15:23) [15]> Чтобы каждый тип ПО для модуля имел свой порядок.
Значит, должно вводиться в том порядке, в котором этому мудрому начальству нужно. И номер им же присваиваться. И никаких автогенераций.
← →
tytus (2006-08-21 15:28) [16]>[15]
Дак не известно, сколько будет каких модулей с конкретным по.
Вот пытаюсь написать ф-ю, но что-то ругается:
create or replace function GetMNN(MainName in varchar2(20)) return number is
Result number;
begin
Result=Max(select MNN from MainTable where MainName=MMODNAME order by MNN);
return(Result);
end GetMNN;
ошибка - PLS-00103
← →
Sergey13 © (2006-08-21 15:32) [17]> [14] tytus (21.08.06 15:22)
Блин! Объясни тогда почему у MID=4 MNN=1, а у MID=7 MNN=3 если MSoftName=V-15 у обоих? А у MID=2 и MID=6 MNN одинаковые, если MSoftName разные.
Либо ты не понял задания, либо одно из двух. 8-)
← →
Sergey13 © (2006-08-21 15:36) [18]Кажется дошло до меня. MNN это порядковый номер MSoftName в выборке. Так что ли? А что если выборка поменяется? Перенумеровывать?
← →
tytus (2006-08-21 15:45) [19]>[18]
Чуйствую - пошлете меня скоро. ЭТО не выборка, а так должны располагаться данные в таблице...
Наверное нужно в начале получить новое MID, затем выбрать все значения MNN, с именем софта, введенного пользователем, отсортировать по возрастанию MNN, и сей максимальный MNN уже использовать для вставки записи.
← →
tytus (2006-08-21 15:48) [20]>ALL
а вообще-то (см. вопрос) командиру кто-то сказал (продвинутые юзеры оракла, наверное), что ТАК МОЖНО делать...
← →
Sergey13 © (2006-08-21 15:55) [21]> [19] tytus (21.08.06 15:45)
> ЭТО не выборка, а так должны располагаться данные в таблице
На это ты не в силах повлиять, поверь.
> [20] tytus (21.08.06 15:48)
Можно по всякому, главное понять ЧТО делать, КОГДА и ЗАЧЕМ.
← →
evvcom © (2006-08-21 16:39) [22]> [16]
Дык, у тебя ошибка синтаксиса.
> Result=Max(select MNN from MainTable where MainName=MMODNAME order by MNN);select max(MNN) into Result from MainTable where MainName=MMODNAME
А нафига тебе там order by?
← →
atruhin © (2006-08-21 16:49) [23]Насколько я понял.
Ему нужно создавать порядковый номер свой для каждого типа товара, автоматически при вводе наименования товара. Т.е. Аналог журналов учета где для каждого товара свой журнал.
Кстати как это сделать не создавая для каждой позиции генератор не представляю. Единственное что приходит в голову уникальный индекс на 2 поля, вставка через хранимку, при соответствующем исключении увеличивать номер.
PS С ораклом не работал, размышляю на уроне IB
← →
Anatoly Podgoretsky © (2006-08-21 19:09) [24]В этой последовательности
1 V-10
2 V-10
3 V-10
1 V-15
2 V-15
4 V-10
3 V-15
Нет ни какой упорядоченности
← →
Fay © (2006-08-21 19:21) [25]> ЭТО не выборка, а так должны располагаться данные в таблице...
Бред
← →
atruhin © (2006-08-21 19:57) [26]> [24] Anatoly Podgoretsky © (21.08.06 19:09)
> Нет ни какой упорядоченности
Ну почему же нет? Для каждого значения MSoftName свой порядковый счетчик.
← →
sniknik © (2006-08-21 21:08) [27]> Ну почему же нет? Для каждого значения MSoftName свой порядковый счетчик.
это логика задания зничения MID, но где упорядоченность? упорядоченно должно бы было так
1 V-10
2 V-10
3 V-10
4 V-10
1 V-15
2 V-15
3 V-15
← →
Anatoly Podgoretsky © (2006-08-21 21:31) [28]atruhin © (21.08.06 19:57) [26]
Не наблюдается, это просто случайная последовательность, закона нет
← →
atruhin © (2006-08-22 05:17) [29]Ну хорошо. Но речь не об упорядоченности, насколько я понял автора он привел данные, скажем в порядке ввода. Причем из заголовка темы следует, что первичный ключ у него по первым 2 столбцам. Все нормально, в чем проблемма? По крайней мере с точки зрения БД.
Второй столбец вводится вручную, первый автогенерация, но счетчик свой для каждого значения второго столбца.
Это насколько мой телепатор сработал.
Кстати чисто теоретически, как такое можно организовать?
← →
evvcom © (2006-08-22 08:32) [30]> [29]
> как такое можно организовать?
Читать не умеем? Или думать? Если не сказано, что вот это именно тот случай, значит это не он? См. [22]. Только такое в триггере не пойдет, а для хранимки в самый раз.
← →
Anatoly Podgoretsky © (2006-08-22 09:06) [31]atruhin © (22.08.06 05:17) [29]
Ни о каком ручном вводе в вопросе нет слов, сказано только что результат должен быть таким, а такое не возможно в принципе, нет закона упорядочивания, нет ни каких дополнительных полей для проведения упорядочивания. Ничего нет.
← →
tytus (2006-08-22 12:29) [32]Доброго дня всем!
решил делать проще. MID оставил в покое - через t_Seq.NextVal и все.
Добавил новый столбец - MNN, в котором как раз и будет счетчик типов софта:
MID MNN MSoftName
1 1 V-10
2 2 V-10
3 3 V-10
4 1 V-15
5 2 V-15
6 4 V-10
7 3 V-15
Вот написал процедуру.
create or replace procedure GetNewMNNValue(AName in varchar2, NewVal out number) is
begin
select Max(MNN) into NewVal from MainTable where MainTable.MSoftname=AName;
end GetNewMNNValue;
Теперь другая проблема. Использую TOracleQuery с параметрами
:MNAME string, NEWMNNV: number. Как мне вызвать эту процедуру, чтобы получить новое значение для софта?
//Funct - TOracleQuery
Funct.SetVariable("MNAME","V-10");
Funct.Execute;
MNNVal:=Funct.GetVariable(0);
Как мне написать параметр SQL для сего компонента???
пишу так - Execute GetNewMNNValue(:MNAME, :NEWMNNV); - ошибка...
← →
ANB © (2006-08-22 12:42) [33]
> Использую TOracleQuery с параметрами
Используй TOracleStoredProc и не мучайся.
← →
ANB © (2006-08-22 12:44) [34]Кстати, выброси на фиг поле MNN. Это значение при желании можно получить прямо в запросе.
← →
tytus (2006-08-22 12:48) [35]>[33]
У меня DOA 4.0.7.1 а там нету такого.
СТавил триал ODAC 5.7.. там есть, но не устраивает по двум причинам - там нужен модуль DB, что подразумевает установку на клиента BDE - а сие непозволимо. Вторая - все время вылетает сообщение, что версия компонентов триальная (60 дней), что напрягает... Может есть другие компоненты БЕЗ BDE?
← →
ANB © (2006-08-22 12:56) [36]
> tytus (22.08.06 12:48) [35]
1. Ты тормоз. Одак не требует БДЕ, ксати, он умеет работать и без клиента оракла
2. в таблице отставляешь 2 поля :
MID, MSoftName. Кстати, MSoftName неплохо было бы заменить ссылкой на справочник.
запрос :
select MT.MID, MT.MSoftName,
ROW_NUMBER()
OVER (PARTITION BY MT.MSoftName ORDER BY MT.MID) AS MNN
from MainTable MT
вернет тебе нужный набор данных. Первичный ключ сделай по MID, и создай индекс (по барабану какой - уникальный или нет) по MSoftName, MID.
И не надо никаких хранимок.
ЗЫ. Оракл рулит !
← →
atruhin © (2006-08-22 14:05) [37]> [30] evvcom © (22.08.06 08:32)
>Или думать? Если не сказано, что вот это именно тот случай, значит это не >он? См. [22]. Только такое в триггере не пойдет, а для хранимки в самый
>раз.
Это ты о чем? Можно пожалуйста поподробнее?
← →
evvcom © (2006-08-28 08:54) [38]> [37] atruhin © (22.08.06 14:05)
> Это ты о чем?
Что именно непонятно? Ладно, забудь. Вариант
> [36] ANB © (22.08.06 12:56)
мне больше нравится. Это и удовлетворяет твоим требованиям, и очень оптимально.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.042 c