Как связать таблицы DB2 - PullRequest
       8

Как связать таблицы DB2

0 голосов
/ 08 января 2019

У меня есть заголовок и таблица деталей, и отношения между ними 1: N В обеих таблицах есть поле с автоматическим номером SEQ, я хочу связать эти две таблицы, используя некоторую технику, чтобы я мог отследить. У меня есть два решения, нуждаюсь в вашей помощи, если вы советуете один из тех или другого лучшего варианта.

(1) Используйте область данных и сохраните число 10000000 для начала и извлеките его для каждой вставки заголовка и вставки нескольких деталей ... увеличьте число и обновите область данных. (В этом случае обе таблицы будут иметь свой собственный автоматический SEQ номер и связанный ключ) (2) извлекать номер SEQ таблицы заголовков при вставке в нее записи и использовать ее в качестве ключа в подробной таблице. (в этом случае заголовок будет иметь ключ Auto seq, а таблица сведений будет иметь ключ Auto SEQ и связанный ключ в качестве автоматического ключа таблицы заголовков)

Пожалуйста, сообщите.

Спасибо

1 Ответ

0 голосов
/ 08 января 2019

Это звучит как работа для последовательности. Последовательность - это объект SQL, который возвращает следующий порядковый номер каждый раз, когда его запрашивают. Он реализован в области данных, но это не имеет для вас никакого значения. Важно то, что последовательность создается и используется с использованием SQL.

Чтобы создать последовательность, в ее простейшей форме вы вводите следующую инструкцию SQL:

CREATE SEQUENCE NEXT_ORDER_NO;

Дополнительную информацию о создании последовательностей можно найти в Центре знаний .

Чтобы сгенерировать число из этой последовательности, вы можете включить NEXT VALUE FOR <sequence name> в инструкцию SQL, например:

INSERT INTO ORDER_MASTER (ORDER_NO, CUSTOMER_NO)
  VALUES (NEXT VALUE FOR NEXT_ORDER_NO, 15);

Вставляет в таблицу ORDER_MASTER новую запись с номером следующего заказа из последовательности и значением 15 в качестве номера клиента.

Чтобы получить самое последнее значение, сгенерированное из последовательности, которую вы используете PREVIOUS VALUE FOR <sequence name>, например:

INSERT INTO ORDER_DETAIL (ORDER_NO, ORDER_LINE, ITEM_NO)
  VALUES (PREVIOUS VALUE FOR NEXT_ORDER_NO, 1, 'AX14450')

При этом в таблицу ORDER_DETAIL вставляется запись с последним сгенерированным ORDER_NO, строкой заказа 1 и номером позиции «AX14450». Вы можете использовать PREVIOUS VALUE FOR <sequence name> столько раз, сколько захотите, и он всегда будет возвращать одно и то же значение. Вы также можете найти дополнительную информацию в Центре знаний .

Есть несколько предостережений. NEXT VALUE и PREVIOUS VALUE ведут себя так, как вы ожидаете, даже если несколько заданий используют одну и ту же последовательность. Задание 1 не будет иметь доступа к сгенерированным значениям задания 2 и наоборот. Но это означает, что в зависимости от того, как вы определяете последовательность, вы можете получить пробелы в своих порядковых номерах или они могут быть выданы не по порядку. Обязательно прочитайте обе ссылки, которые я предоставил, для более подробных объяснений.


Изменить:

Если вы не хотите использовать NEXT VALUE непосредственно во вставке, вы также можете использовать VALUES INTO, например:

VALUES NEXT VALUE FOR NEXT_ORDER_NO INTO :<local variable>

Более подробную информацию об этом утверждении можно найти в Центре знаний .


Редактировать (2)

В качестве альтернативы последовательности, вы можете использовать столбец идентификаторов (это то, что вам нужно на основе ваших комментариев), но вам не нужно делать что-то безумное в вашем SQL, чтобы получить последнее назначенное значение идентификатора. , Используйте IDENTITY_VAL_LOCAL вот так:

INSERT INTO HTABLE (NAME, AGE) VALUES ('Mark', 51);

INSERT INTO DTABLE (hseq,Address,Zip) 
  VALUES (IDENTITY_VAL_LOCAL(),'1701 creek ave', 19670);

INSERT INTO DTABLE (hseq,Address,Zip) 
  VALUES (IDENTITY_VAL_LOCAL(), '22701 creek ave', 19270);

Значение IDENTITY_VAL_LOCAL() изменяется только при выполнении INSERT в таблице со столбцом идентификаторов. Как и PREVIOUS VALUE, IDENTITY_VAL_LOCAL() вернет ноль, если ему не предшествует INSERT в таблице со столбцом идентификаторов. А также, как и PREVIOUS VALUE, INSERT должен выполнять ту же работу, что и вызов IDENTITY_VAL_LOCAL(), чтобы иметь какое-либо влияние.

Найти сравнение идентичных столбцов и последовательностей здесь .

...