Как ВСТАВИТЬ строку в таблицу, если эта строка еще не существует в той же таблице

Как INSERT строка в таблице, если эта строка еще не существует в той же таблице? Я хочу что-то подобное.

insert into note (note_id, user_book_id, course_user_id, book_edition_id, book_id, role_type_id, page_id, book_page_number, xcoord, ycoord,
                        width, height, share_across_courses, date_created, date_updated, created_by, updated_by, description, share_with_students,text)

select  note_s.nextval, i_user_book_id, i_course_user_id, book_edition_id, book_id, n.role_type_id, page_id, book_page_number, xcoord,          ycoord, width, height, share_across_courses, sysdate, sysdate, i_user_id, i_user_id, description, share_with_students,text

from  note n inner join course_user cu
on n.course_user_id = cu.course_user_id
where     cu.course_id = 23846
and where not exists (select  note_s.nextval, i_user_book_id, i_course_user_id, book_edition_id, book_id, n.role_type_id, page_id, book_page_number, xcoord, ycoord,
                    width, height, share_across_courses, sysdate, sysdate, i_user_id, i_user_id, description, share_with_students,text

from  note n inner join course_user cu
on n.course_user_id = cu.course_user_id
where     cu.course_id = 23846);

То есть в таблице примечаний, если запись уже существует для определенного course_user_id, тогда ничего не делать. В противном случае, если нет записи для этого конкретного course_user_id, вставьте в примечание для этого course_user_id.

Но мой код не работает.

Вот, note_id является PRIMARY KEY в таблице заметок и Course_user_id является PRIMARY KEY в таблице course_user.

2 ответа

Более того, вы можете попробовать другой подход, используя ORACLE HINTS, чтобы избежать дублирования при вставке INDEX, как показано ниже. Но это применимо для 11g Oracle Oracle и выше. Надеюсь это поможет.

INSERT
  /*+ ignore_row_on_dupkey_index(note_id) */
INTO note
  (
    note_id,
    user_book_id,
    course_user_id,
    book_edition_id,
    book_id,
    role_type_id,
    page_id,
    book_page_number,
    xcoord,
    ycoord,
    width,
    height,
    share_across_courses,
    date_created,
    date_updated,
    created_by,
    updated_by,
    description,
    share_with_students,
    text
  )
  (SELECT note_s.nextval,
      i_user_book_id,
      i_course_user_id,
      book_edition_id,
      book_id,
      n.role_type_id,
      page_id,
      book_page_number,
      xcoord,
      ycoord,
      width,
      height,
      share_across_courses,
      sysdate,
      sysdate,
      i_user_id,
      i_user_id,
      description,
      share_with_students,
      text
    FROM note n
    INNER JOIN course_user cu
    ON n.course_user_id = cu.course_user_id
    WHERE cu.course_id  = 23846
    AND NOT EXISTS
      (SELECT note_s.nextval,
        i_user_book_id,
        i_course_user_id,
        book_edition_id,
        book_id,
        n.role_type_id,
        page_id,
        book_page_number,
        xcoord,
        ycoord,
        width,
        height,
        share_across_courses,
        sysdate,
        sysdate,
        i_user_id,
        i_user_id,
        description,
        share_with_students,
        text
      FROM note n
      INNER JOIN course_user cu
      ON n.course_user_id = cu.course_user_id
      WHERE cu.course_id  = 23846
      ));

Вы можете попробовать MERGE для достижения этой цели. Надеюсь ниже поможет фрагмент. Я не проверял это, поскольку у меня нет рабочего пространства со мной нет \w.

MERGE INTO note nt USING
(SELECT note_s.nextval,
  i_user_book_id,
  i_course_user_id,
  book_edition_id,
  book_id,
  n.role_type_id,
  page_id,
  book_page_number,
  xcoord,
  ycoord,
  width,
  height,
  share_across_courses,
  sysdate,
  sysdate,
  i_user_id,
  i_user_id,
  description,
  share_with_students,
  text
FROM note n
INNER JOIN course_user cu
ON n.course_user_id = cu.course_user_id
WHERE cu.course_id  = 23846
AND NOT EXISTS
  (SELECT note_s.nextval,
    i_user_book_id,
    i_course_user_id,
    book_edition_id,
    book_id,
    n.role_type_id,
    page_id,
    book_page_number,
    xcoord,
    ycoord,
    width,
    height,
    share_across_courses,
    sysdate,
    sysdate,
    i_user_id,
    i_user_id,
    description,
    share_with_students,
    text
  FROM note n
  INNER JOIN course_user cu
  ON n.course_user_id     = cu.course_user_id
  ))A ON (a.course_user_id = nt.course_user_id) 
  WHEN MATCHED THEN
UPDATE SET nt.bookId = a.book_id /*-- dummy update*/
  WHEN NOT MATCHED THEN
INSERT
  (
    nt.note_id,
    nt.user_book_id,
    nt.course_user_id,
    nt.book_edition_id,
    nt.book_id,
    nt.role_type_id,
    nt.page_id,
    nt.book_page_number,
    nt.xcoord,
    nt.ycoord,
    nt.width,
    nt.height,
    nt.share_across_courses,
    nt.date_created,
    nt.date_updated,
    nt.created_by,
    nt.updated_by,
    nt.description,
    nt.share_with_students,
    nt.text
  )
  VALUES
  (
    a.note_id,
    a.user_book_id,
    a.course_user_id,
    a.book_edition_id,
    a.book_id,
    a.role_type_id,
    a.page_id,
    a.book_page_number,
    a.xcoord,
    a.ycoord,
    a.width,
    a.height,
    a.share_across_courses,
    a.date_created,
    a.date_updated,
    a.created_by,
    a.updated_by,
    a.description,
    a.share_with_students,
    a.text
  );
Другие вопросы по тегам