|
Реализовать constraint
|
|||
---|---|---|---|
#18+
Всем привет, подскажите следующее, есть таблица master - содержащее уникальный индекс на два поля, есть таблица detail - должна содержать внешний ключ на эти уникальные поля таблицы master Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Собственно вопрос, каким образом можно выкрутиться в данном случаи, только триггер на detail? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 15:49 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
wsnet есть таблица master - содержащее уникальный индекс на два поля Нет в этой таблице уникального индекса на два поля. Об этом прямо и говорит ошибка: ORA-02270 no matching primary or unique key for then column list Вы это хотите сделать? Нестандартный подход ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 15:54 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
AlexFF__|, хорошо, это ясно, но вопрос в ином был, как выкрутиться? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 16:11 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
AlexFF__| Нет в этой таблице уникального индекса на два поля. Об этом прямо и говорит ошибка: ORA-02270 no matching primary or unique key for then column list ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 16:12 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
wsnet каким образом можно выкрутиться в данном случаи ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 16:13 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
Как Elic намекнул + invisible: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33.
Ну и в чем сакральный смысл менять a на b (decode(a,null,null,b)) если a not null и b на a (decode(b,null,null,a)) если b not null? SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 16:34 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
SY, Elic спасибо. SY Как Elic намекнул + invisible: Ну и в чем сакральный смысл менять a на b (decode(a,null,null,b)) если a not null и b на a (decode(b,null,null,a)) если b not null? SY. SY, прибегнуть пришлось из-за того, что изначально уникальным ключом было одно поле, а не две: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31.
Быть может Oracle позволяет по-иному выйти из ситуации? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 17:15 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
SY Как Elic намекнул + invisible: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33.
Ну и в чем сакральный смысл менять a на b (decode(a,null,null,b)) если a not null и b на a (decode(b,null,null,a)) если b not null? SY. Увы, моя версия: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 17:23 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
wsnet Увы, моя версия: Но версия - гуано. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 18:17 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
wsnet Увы, моя версия: Ну убери invisible (правда придется указывать список полей там где раньше был *): Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89.
Но главное: в чем сакральный смысл менять a на b (decode(a,null,null,b)) если a not null и b на a (decode(b,null,null,a)) если b not null? SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 18:34 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
SY, вот это и не весьма устраивает нет invisible, Вопрос а кроме виртуальных столбцов есть ли альтернативные варианты? Триггер, например? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 18:45 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
wsnetкаким образом можно выкрутиться в данном случаи, только триггер на detail? Ты создавай не уникальный индекс, а unique constraint. Оно позволяет null-ы и удовлетворяет foreign key. PS: А с совпадением значений второго поля придётся разбираться бизнес-логикой. Ну или хотя бы бытовой: на какую из двух записей должна ссылаться запись в detail (null, 1)? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 18:52 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
wsnet Вопрос а кроме виртуальных столбцов есть ли альтернативные варианты? Триггер, например? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 19:10 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov wsnetкаким образом можно выкрутиться в данном случаи, только триггер на detail? Ты создавай не уникальный индекс, а unique constraint. Оно позволяет null-ы и удовлетворяет foreign key. PS: А с совпадением значений второго поля придётся разбираться бизнес-логикой. Ну или хотя бы бытовой: на какую из двух записей должна ссылаться запись в detail (null, 1)? Не очень ясно как в данном случаи мне поможет unique constraint? Ведь таблица заполнена изначально данными. Здесь указывал на это 22284458 Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 19:11 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Ты создавай не уникальный индекс, а unique constraint. Оно позволяет null-ы и ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 19:11 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
Elic wsnet Вопрос а кроме виртуальных столбцов есть ли альтернативные варианты? Триггер, например? Я не очень понял, а если все же вариант с триггером простейшим применить: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 19:29 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
wsnetНе очень ясно как в данном случаи мне поможет unique constraint? Ведь таблица заполнена изначально данными. При таких данных тебе уже ничто не поможет. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 19:31 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
wsnet Триггер, например? Решение триггером потребует сериализации на уровне таблицы. UK/FK сериализует на уровне строки дубликата/родителя. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 19:33 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, пожалуйста почитайте топик еще раз, не надо писать чтобы написать. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 19:34 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
SY, хорошо, вы имейте ввиду многопользовательскую работу с таблицей? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 19:36 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
wsnetinsert into softmaster.detail(a, b)values (11,2) * ERRORat line1: ORA-20001: Не найдена запись в master ORA-06512:at "SOFTMASTER.INS_UPD_DETAIL", line16 ORA-04088: error during executionof trigger 'SOFTMASTER.INS_UPD_DETAIL' А теперь попробуй с (null,1). Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 19:38 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
wsnet SY, хорошо, вы имейте ввиду многопользовательскую работу с таблицей? Да. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 19:39 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, попробую, но пока задача этого не предполагает: Код: plsql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 19:48 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
wsnet Я не очень понял, а если все же вариант с триггером простейшим применить: ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 19:49 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
Elic wsnet Я не очень понял, а если все же вариант с триггером простейшим применить: Elic, скажу так тебе, в таблицу softmaster.master добавляет записи один человек (очень редко с ней работает), с таблицей softmaster.detail могут работать одновременно несколько человек по добавлению записей. Как думаешь при таких данных нужна она или же обойдемся триггером? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 19:59 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
SY, Elic подскажите, как с этим бороться: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78.
deterministic что есть не могу найти четкое определение? И что изменится если данную функцию я сделаю таковой? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 20:35 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
wsnet deterministic что есть не могу найти четкое определение? И что изменится если данную функцию я сделаю таковой? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
Function Declaration and Definition : DETERMINISTIC Tells the optimizer that the function returns the same value whenever it is invoked with the same parameter values (if this is not true, then specifying DETERMINISTIC causes unpredictable results). Creating a Function-Based Index : In addition to the prerequisites for creating a conventional index, if the index is based on user-defined functions, then those functions must be marked DETERMINISTIC. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 21:11 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
wsnet SQL> alter table softmaster.detail 2 add ( 3 a1 int generated always as (decode(b,null,null,a)), 4 b1 int generated always as (decode(a, null, null, softmaster.GetB()) ) 5 ); b1 int generated always as (decode(a, null, null, softmaster.GetB())) * ERROR at line 4: ORA-30553: The function is not deterministic [/src] deterministic что есть не могу найти четкое определение? И что изменится если данную функцию я сделаю таковой? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
https://docs.oracle.com/en/database/oracle/oracle-database/12.2/lnpls/DETERMINISTIC-clause.html#GUID-6AECC957-27CC-4334-9F43-0FBE88F92654] DETERMINISTIC Clause The deterministic option marks a function that returns predictable results and has no side effects . (Детерминированная опция отмечает функцию, которая возвращает предсказуемые результаты и не имеет побочных эффектов .) То есть вы помечаете, что это такая функция, возвращаемые значения которой предсказуемы и нет от неё побочных эффектов. То есть указываете, что сколько бы раз вы не вызвали функцию без аргументов, она вернет одно и то же значение. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 21:16 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
wsnet Как думаешь при таких данных нужна она или же обойдемся триггером? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 21:18 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
wsnet, С учетом уже проведенного обсуждения сформулируйте, пожалуйста, с самого начала и до самого конца максимально точно и исчерпывающе, что именно вы хотите сделать? Как должна реагировать база на те или иные действия? Другие сведения? При этом не нужно писать никаких слов и предположений про то, как именно это будет реализовано. То есть вы формулируете техническое задание, а мы предлагаем, как его реализовать. Обсуждаем это между собой, а потом с вами. Чтобы у нас с вами не получалось что-то вроде P.S. Кстати, эта старая известная картинка была в весьма неплохой статье Бизнес и системный аналитик. Что нужно знать В ней есть раздел "Научите заказчика отвечать на вопрос «Что?», а не формулировать требования в формате «Как»" ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 21:30 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
Вот я тоже читал-читал, но так и не понял, зачем нужно при пустом А подставлять В, а при пустом В подставлять А. Да ещё и с учётом того, что В физически не может быть пустым. Вот нафига эти пляски с FB-индексами? Можно ж просто добавить поле в существующую таблицу, заполнить его (если это прямо уж так нужно) и сделать новый констрейнт. Ведь 2-е поле в существующем констрейнте - это ОСЛАБЛЕНИЕ ограничения, т.е. особых проблем на существующих данных не должно привносить. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 21:42 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
Elic AlexFF__| Нет в этой таблице уникального индекса на два поля. Об этом прямо и говорит ошибка: ORA-02270 no matching primary or unique key for then column list Стыд мне и позор! Мало того, что сам не вижу различия между индексами и ограничениями целостности, так еще и ввел в заблуждение уважаемых гуру форума ;) Но все в любом случае молодцы. Тема, которая должна была окончится на 3-4 сообщении с комментарием "чтозахреньпридумалисрочноменять" уже заходит за 2 страницы ) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2021, 22:59 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
SQL*Plus, в посте 22284458 сформулировал исходные данные. Еще раз для AlexFF__| изначально таблица softmaster.master была c одним уникальным ключом softmaster.master.a, далее понадобилось изменить уникальный ключ таблицы - добавив уникальный ключ из двух полей softmaster.master.a и softmaster.master.b, но при попытке добавить уникальный индекс (ограничение unique) имеем ошибку: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31.
То есть, если уникальный индекс состоит из нескольких полей и хоть одно поле непустое - запись в индекс будет сделана (причем все значения полей, включая NULL). Соответственно вторая запись с теми же значениями будет нарушать ограничение уникальности. В связи с этим понадобилось ввести следующий FBI-индекс: Код: plsql 1.
Вопрос, быть может в Oracle есть способ сделать таким образом, чтобы не прибегать к созданию таких FBI-индексов, я этого не нашел. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2021, 10:09 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
wsnet То есть, если уникальный индекс состоит из нескольких полей и хоть одно поле непустое - запись в индекс будет сделана (причем все значения полей, включая NULL). Соответственно вторая запись с теми же значениями будет нарушать ограничение уникальности. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2021, 10:45 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров, я же говорил, что поле дочерней таблицы detail.a ссылается на master.a, поле detail.b на master.b. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2021, 11:03 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
Точнее, в дочерней таблице запись detail.a, detail.b ссылается на запись master.a, master.b ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2021, 11:17 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
Запись master.a, master.b уникальна. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2021, 11:23 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
wsnetЗапись master.a, master.b уникальна. Ошибка говорит об обратном. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2021, 13:13 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
wsnet Запись master.a, master.b уникальна. Код: plsql 1. 2. 3. 4.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2021, 14:21 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
SY wsnet Запись master.a, master.b уникальна. Код: plsql 1. 2. 3. 4.
SY. Раньше было именно так уникальное поле a в таблице. То есть можно было хранить записи в таблице: Код: plsql 1. 2. 3. 4. 5.
Сейчас при попытке ввести уникальную запись по двум полям a и b: Код: plsql 1. 2. 3. 4.
позволит хранить записи: Код: plsql 1. 2. 3. 4. 5.
А вот хранить (таких записей много в таблице на текущий момент) или добавить еще одну запись: Код: plsql 1.
Не получается из-за ошибки в посте 22284635 . Как обойти это средствами Oracle я не нашел поэтому и сделал FBI-индекс. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2021, 15:25 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
wsnetКак обойти это средствами Oracle я не нашел поэтому и сделал FBI-индекс. А следовало вправить мозги тому чудаку, который так криво базу спроектировал. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2021, 15:47 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
wsnet Сейчас при попытке ввести уникальную запись по двум полям a и b: Значит нет у тебя уникальности по a,b. Ты бы для начала выдал все требования. Хотя все твои проблемы стары как мир - нормализация: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2021, 15:51 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
wsnet Вячеслав Любомудров, я же говорил, что поле дочерней таблицы detail.a ссылается на master.a, поле detail.b на master.b. Это ПОЛЯ. А тебе говорят о ЗАПИСЯХ. Вот есть у тебя 2 одинаковых записи (и в обеих NULL в поле A). На какую ИЗ НИХ должна ссылаться запись в дочерней таблице? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2021, 22:02 |
|
Реализовать constraint
|
|||
---|---|---|---|
#18+
wsnet SQL*Plus, в посте 22284458 сформулировал исходные данные. Нет. Там приведен набор команд - попытка решения задачи, которая четко не сформулирована. В процессе четкого формального описания вашей задачи, вы вполне можете наткнуться сами на её решение. Попробуйте. Сформулируете ваше ТЗ? Не надо писать КАК делать, напишите ЧТО вам нужно сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2021, 23:23 |
|
|
start [/forum/topic.php?all=1&fid=52&tid=1880415]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 165ms |
0 / 0 |