Oracle отключить foreign key

Обновлено: 03.07.2024

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

Я новичок в базах данных, поэтому, пожалуйста, скажите мне правильный SQL-запрос, чтобы удалить или удалить значение внешнего ключа.

ОТВЕТЫ

Ответ 1

Ответ 2

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

В любом случае синтаксис выглядит следующим образом:

Ответ 3

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

Ответ 4

Чтобы удалить все ограничения из БД:

Ответ 5

В зависимости от DB вы используете там синтаксис или другой.

Если вы используете Oracle, вы должны указать то, что вам сказали другие пользователи:

Но если вы используете MySQL, тогда это даст вам синтаксическую ошибку, вместо этого вы можете ввести:

Ответ 6

EDIT: не заметил, что вы использовали sql-сервер, мой плохой

Ответ 7

Удалите все внешние ключи таблицы:

Ответ 8

Используйте эти запросы, чтобы найти все FK:

Ответ 9

Вы должны рассмотреть (временно) отключение ограничения до полного его удаления.

Если вы посмотрите на TSQL создания таблицы, вы увидите что-то вроде:

Вы можете запустить

. затем вставьте/обновите кучу значений, которые нарушают ограничение, а затем верните его, запустив исходный оператор CHECK .

(Я должен был сделать это, чтобы очистить плохо разработанные системы, которые я унаследовал в прошлом.)

Ответ 10

Кроме того, вы также можете удалить ограничение внешнего ключа из самой SQL Server Management Studio. Вы можете попробовать, если команды не работают.

  • Разверните представление базы данных.
  • Щелкните правой кнопкой мыши на таблице, которая имеет ограничение внешнего ключа. Выберите "Дизайн". Откроется вкладка с информацией о столбцах таблицы.
  • Щелкните правой кнопкой мыши на столбце с ссылкой на внешний ключ. Или вы можете щелкнуть правой кнопкой мыши по любому столбцу. Выберите "Отношения".
  • В появившемся окне появится список отношений (если он у вас есть).
  • Оттуда вы можете удалить ограничение внешнего ключа.

Я надеюсь, что это поможет

Ответ 11

Я также новичок в базе данных, но у меня был похожий вопрос. Если вы не знаете своего имени ограничения, вы можете попробовать это:

У меня есть две модели Django, каждая с иностранным ключом к другой. Удаление экземпляров модели возвращает ошибку из-за ограничения ForeignKey:

можно ли временно отключить ограничения и удалить их в любом случае?

попробовать DISABLE KEYS или

чтобы отключить ограничение внешнего ключа глобально, выполните следующие действия:

и не забудьте установить его обратно, когда вы сделали

предупреждение: вы должны делать это только при выполнении обслуживания в однопользовательском режиме. Как это может привести к несогласованности данных. Например, это будет очень полезно, когда вы загружаете большой объем данных с помощью вывода mysqldump.

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

вместо отключения ограничения измените его на ON DELETE SET NULL. Это приведет к аналогичной вещи, и вам не придется включать и выключать ключ. Вот так:

чтобы отключить ограничение внешнего ключа глобально:

и для активного ограничения внешнего ключа

очень простое решение с phpmyadmin: в вашей таблице перейдите на вкладку SQL, после редактирования команды SQL, которую вы хотите запустить, рядом с GO есть флажок "Включить проверки внешнего ключа".Отключите этот флажок и запустите SQL. Затем он будет автоматически перепроверен.

Если ключевое поле nullable, то вы также можете установить значение null перед попыткой удалить его:

в phpMyAdmin вы можете выбрать несколько строк, затем нажмите действие удалить. Вы войдете в экран, на котором перечислены запросы на удаление, вы можете снять флажок проверка внешнего ключа и нажать "Да", чтобы выполнить их.

Это позволит вам удалить строки, даже если есть ограничение на удаление.

Не рекомендуется устанавливать ограничение внешнего ключа в 0, потому что в этом случае ваша база данных не будет гарантировать, что она не нарушает ссылочную целостность. Это может привести к неточным, вводящим в заблуждение или неполным данным.

вы создаете внешний ключ по причине: потому что все значения в дочернем столбце должны совпадать со значением в Родительском столбце. Если нет ограничений внешнего ключа, дочерняя строка может иметь значение, которое не находится в родительской строке, что приведет к неточные данные.

например, предположим, у вас есть веб-сайт для входа студентов, и каждый студент должен зарегистрироваться для учетной записи в качестве пользователя. У вас есть одна таблица для идентификаторов пользователей, с идентификатором пользователя в качестве первичного ключа; и другая таблица для учетных записей студентов, с идентификатором студента в качестве столбца. Поскольку каждый студент должен иметь идентификатор пользователя, имеет смысл сделать идентификатор студента из таблицы учетные записи студентов внешним ключом, который ссылается на идентификатор пользователя первичного ключа в таблице идентификаторы пользователей. Если есть нет проверки внешнего ключа, у студента может быть идентификатор студента и нет идентификатора пользователя, что означает, что студент может получить учетную запись, не будучи пользователем, что неправильно.

представьте, если это происходит с большим количеством данных. Вот почему вам нужна проверка внешнего ключа.

лучше всего выяснить, что вызывает ошибку. Скорее всего, вы пытаетесь удалить из родительской строки без удаления из дочерней строки. Попробуйте удалить из дочерней строки перед удалением из родительской ряд.

Илья Дергунов

Ограничения целостности в реляционных базах данных (и Oracle Database в частности) позволяют легко и автоматически применять важные бизнес-правила к таблицам базы данных. Например, в таблице, используемой в системе управления кадрами, нельзя завести сотрудника, не назначив ему руководителя. При создании связанных таблиц можно объявить необходимые ограничения целостности, которые должны быть удовлетворены при каждом вводе или модификации данных в таблице.

Для выполнения бизнес-правил можно также задействовать логику приложения,однако ограничения целостности обычно применять проще, и обычно они хорошо выполняют свою работу, гарантируя, что вставки, обновления и удаления данных таблиц будут соответствовать определенным правилам. С другой стороны, логика приложения обладает тем преимуществом, что позволяет отклонить или подтвердить данные без обращения к содержимому таблицы. Таким образом, выбирать метод выполнения бизнес-правил — логикой приложения или ограничениями целостности — необходимо на основе потребностей конкретного приложения. В любом случае ограничения целостности настолько фундаментальны для операций в реляционных базах данных, что вы обречены на их использование в конкретной базе.

По умолчанию Oracle разрешает значения null во всех столбцах. Если эти значения недопустимы для некоторых столбцов таблицы, для них необходимо задавать ограничение NOT NULL. Обратите внимание, что налагать ограничения базы данных на таблицы можно как во время их создания, так и позднее, с помощью команды ALTER TABLE.Однако очевидно, что если в таблице уже имеются значения null или дублированные данные, то изменить таблицу, применив ограничение NOT NULL или ограничение уникальности, будет невозможно.

Для таблицы Oracle можно установить несколько типов ограничений. Упрощенно их можно разделить на пять основных типов:

Все перечисленные типы ограничений обсуждаются далее в этой статье. В дополнение будет также представлен краткий обзор состояний ограничений целостности.

Ограничения первичного ключа

Первичный ключ — очень важный тип ограничения в таблице. Когда необходимо,чтобы значения столбца идентифицировались уникальным образом, это обеспечивается созданием первичного ключа по значению столбца. Столбец, на котором определен первичный ключ, должен быть уникальным и не null.

Таблица может иметь только один первичный ключ, который можно создать при создании таблицы, как показано в следующем примере:

Кроме того, можно добавить ограничение и к существующей таблице:

Поскольку в предыдущем примере ограничению не присвоено имя, Oracle даст ему имя, сгенерированное системой. Если требуется присвоить ограничению собственное имя, воспользуйтесь следующей командой, которая назовет ограничение dept_pk:

Обратите внимание, что если первичный ключ будет построен по более чем одному столбцу (т.е. будет составным), специфицировать назначение первичного ключа напротив имени столбца при создании таблицы нельзя. Столбцы первичного ключа должны быть указаны как отдельный элемент оператора CREATE TABLE после списка всех столбцов.

На заметку! В обоих предыдущих примерах Oracle автоматически создает индексы на столбце,который назначен первичным ключом.

Ограничения NOT NULL

Обычно таблица имеет один или более столбцов, в которых не допускается значение null — т.е. без значений. Хорошим примером является столбец last_name таблицы employee. Заставить пользователей обязательно вносить значения в этот столбец можно при создании таблицы, указав опцию NOT NULL для столбца, который не должен быть null:

Если таблица уже создана, и требуется модифицировать столбец с допускающего null на не допускающий null, для этого можно использовать следующий оператор:

Проверочные ограничения

используете Проверочные (CHECK) ограничения применяются для обеспечения соответствия данных столбца определенным параметрам, которые вы укажете. Например,предположим, что годовая зарплата сотрудника фирмы не может быть равна или превышать $100 000 при определенных обстоятельствах. Это ограничение можно навязать с помощью следующего оператора, который устанавливает ограничение CHECK на столбце SALARY:

Ограничение уникальности

Ограничение уникальности (UNIQUE) очень распространено в реляционных базах данных. Эти ограничения гарантируют уникальность строк в реляционной таблице.В таблице могут существовать сразу несколько таких ограничений. Например, ограничение уникальности на столбце employee_id гарантирует, что ни один сотрудник не появится дважды в таблице employee.

В следующем примере первый оператор специфицирует ограничение уникальности на комбинации столбцов dept_name и location:

Создать уникальное ограничение на таблице department можно также с помощью такого оператора ALTER TABLE:

Ограничения ссылочной целостности

Ограничения ссылочной целостности гарантируют, что значения определенных важных столбцов будут иметь смысл. Предположим, что есть родительская таблица, которая ссылается на значения из другой таблицы, как в случае таблиц dept и employee.Сотрудник в таблице employee не может быть назначен в департамент, если такой департамент в таблице dept не существует.

Гарантировать существование действительного департамента можно с помощью ограничения ссылочной целостности. В этом случае столбец departament_id служит первичным ключом таблицы dept, а столбец dept_id в таблице employee, ссылающийся на соответствующий столбец таблицы department, называется внешним ключом. Таблица,содержащая внешний ключ, обычно называется дочерней таблицей, а таблица, содержащая ключ, на который ссылается внешний ключ — родительской таблицей. Как и со всеми прочими типами ограничений, ссылочные ограничения целостности можно создавать во время создания таблицы или позднее, с помощью оператора ALTER TABLE:

База данных назначает столбец dept_id таблицы employee внешним ключом, потому что он ссылается на столбец dept_id таблицы dept. Обратите внимание, что для того, чтобы столбец служил ссылочным (на который ссылаются), он должен быть уникальным или же быть первичным ключом в таблице, на которую установлена ссылка.

Состояния ограничений целостности

Как было показано в предыдущем выше, ограничения целостности определяются на таблицах для гарантии, что данные, нарушающие заранее установленные правила,в таблицу не попадут. Однако иногда, например, при загрузке данных, ограничения целостности не должны поддерживаться в действительном состоянии, поскольку это приведет к определенным проблемам. При необходимости Oracle позволяет отключать ограничения и затем включать их, когда они снова понадобятся. Давайте рассмотрим некоторые способы изменения состояния ограничений таблиц.

При загрузке больших объемов данных с использованием SQL*Loader или утилиты Import может потребоваться значительное время на загрузку данных, каждую строку которых нужно проверять на предмет нарушения целостности. Более эффективная стратегия предусматривает отключение ограничения, загрузку данных и последующую проверку корректности загруженных данных. После завершения загрузки ограничения вновь вводятся в действие посредством включения. Когда ограничение отключается,как описано здесь, база данных уничтожает индекс. Подобным образом реализуется лучшая стратегия — предварительное создание неуникальных индексов для ограничений, которые база данных не должна уничтожать, поскольку они обрабатывают дублированные записи.

На заметку! Состояние enabled (включено) — это состояние ограничений Oracle по умолчанию

Отключаются ограничения двумя способами: указание в качестве состояния ограничения либо disable validate (отключить с проверкой), либо disable no validate (отключить без проверки) с использованием конструкции DISABLE VALIDATE и DISABLE NO VALIDATE, соответственно. Аналогично, для включения ограничения применяются конструкции ENABLE VALIDATE и ENABLE NO VALIDATE. Ниже кратко обсуждаются различные способы включения и отключения ограничений.

Состояние Disable Validate

В случае использования команды DISABLE VALIDATE выполняются следующие два действия сразу. Во-первых, конструкция VALIDATE гарантирует, что все данные в таблице удовлетворяют условию ограничения. Во-вторых, конструкция DISABLE избавляет от необходимости поддерживать ограничение. Oracle сбрасывает индекс ограничения,но сохраняет его действительным. Вот пример:

После выдачи приведенного выше оператора SQL наличие только уникальных комбинаций уникальных ключей prod_id и customer_id в таблице гарантируется, однако уникальный индекс не поддерживается.

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

Состояние Disable No Validate

При отключении ограничения без проверки ограничение отключается, и нет никаких гарантий соответствия данных требованиям ограничения, поскольку Oracle не предпринимает проверку его действительности. Это по существу то же самое, что команда DISABLE CONSTRAINT.

Состояние Enable Validate

Это состояние ограничения включает ограничение, гарантируя проверку всех данных на соответствие условию ограничения. Это состояние в точности то же, что обычное состояние “включено”. Следующий пример демонстрирует использование этого состояния:

Состояние Enable No Validate

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

Более подходящая стратегия заключалась бы в использовании состояния DISABLE NOVALIDATE при загрузке данных, с переходом к состоянию ENABLE NOVALIDATE и затем к ENABLE VALIDATE в конце цикла извлечения, трансформации и загрузки (extraction,transformation, loading — ETL).

Ограничения Rely

Обычно перед загрузкой в таблицы хранилища данных предполагается выполнение шагов ETL. Если есть уверенность в качестве данных, можно сэкономить время на загрузку, отключив проверку ограничений. Для этого применяется команда ALTER TABLE с конструкцией RELY DISABLE NOVALIDATE, как показано в следующем примере:

Отложенные и немедленные ограничения

В дополнение к указанию типа проверки достоверности ограничения можно специфицировать, когда именно должно проверяться ограничение в процессе загрузки данных.

Если хотите, чтобы ограничение проверялось немедленно после модификации данных, выберите опцию not defferable (не откладывая), которая, фактически задает поведение по умолчанию в базах данных Oracle. Если необходимо выполнить едино-временную проверку ограничения после фиксации всей транзакции, выберите опцию deferrable. Все ограничения и внешние ключи могут быть объявлены как deferrable или not deferrable.

В случае выбора опции deferrable появляются еще две дополнительных опции.Ограничение deferrable можно специфицировать либо как initially deferred, либо как initially immediate (изначально отложенное или изначально немедленное). В первом случае база данных откладывает проверки ограничения до окончания транзакции. Если же была выбрана опция initially immediate, то база данных проверит ограничения перед изменением любых данных. Обратите внимание, что если предварительно создается индекс, то он должен быть не уникальным, чтобы обработать дублированные значения.

Следующий пример показывает, как специфицировать такого рода ограничения в таблице employee:

В Oracle также предусмотрен способ изменения отложенного ограничения с immediate на deferred или наоборот с помощью следующих операторов:

Представления, относящиеся к ограничениям и индексам

DBA_CONSTRAINTS

Представление DBA_CONSTRAINTS предоставляет информацию обо всех типах ограничений таблицы в базе данных. Опрос этого представления делается, когда необходимо узнать, какого типа ограничения имеет таблица. Представление перечисляет несколько типов ограничений, как показано в следующем запросе:

Следующий запрос позволит узнать, какие ограничения установлены для таблицы TESTD. Ответ на запрос показывает, что таблица имеет единственное ограничение CHECK. Префикс SYS в столбце NAME отражает тот факт, что CONSTRAINT_NAME — имя по умолчанию, а не явно указанное владельцем таблицы.

Обратите внимание, что если необходимо увидеть определенное ссылочное ограничение и правило удаления, то нужно применить следующую вариацию предыдущего запроса:

DBA_CONS_COLUMNS

Представление DBA_CONS_COLUMNS показывает имя столбца и позицию в таблице,где определено ограничение:

SQL: язык структурированных запросов (Structured Query Language), называемый SQL. Это язык программирования специального назначения, язык запросов к базе данных и язык программирования, используемый для доступа к данным и запросов, обновления и управления системным языком реляционных баз данных.

  • DDL (язык определения данных): язык определения данных.
  • DML (язык манипулирования данными): язык манипулирования данными.
  • DCL (Data Control Language): язык управления данными.
  • TCL (язык управления транзакциями): язык управления транзакциями.

Обычно используемые операторы DDL включают:

  • создать таблицу: создать таблицу базы данных.
  • создать индекс: создать индекс таблицы базы данных.
  • drop table: удалить таблицу базы данных.
  • drop index: удалить индекс таблицы базы данных.
  • truncate: удалить все строки в таблице.
  • изменить таблицу: изменить структуру таблицы, добавить, изменить и удалить столбцы.
  • изменить таблицу добавить ограничение: добавить ограничение к существующей таблице.

Обычно используемые операторы DML включают:

  • вставить: добавить данные в базу данных.
  • update: изменить данные в базе данных.
  • удалить: удалить данные из базы данных.
  • select: выбрать (запросить) данные.

Обычно используемые операторы DCL:

  • grant: Предоставление разрешений или ролей пользователям или другим ролям (предоставление разрешений на доступ).
  • revoke: отозвать разрешения у пользователей или ролей базы данных (отозвать разрешения на доступ).
  • lock: заблокировать определенную часть базы данных.

Обычно используемые операторы TCL:

  • commit: зафиксировать обработку транзакции.
  • откат: откат обработки транзакции.
  • точка сохранения: установите точку сохранения.

Примечание. Используйте инструмент SQLDeveloper для переключения между двумя пользователями. Вы не можете использовать команду «conn username / password» для переключения соединения. Команда подключения является командой SQLPlus. Окно выполнения SQL в инструменте SQLDeveloper не может быть выполнено, а инструмент SQLDeveloper - нет. Предоставьте окно для выполнения команд SQLPlus,
Если вы хотите подключиться к базе данных, используйте графические операции

Типы данных, обычно используемые в Oracle: типы символов, числовые типы, типы даты и времени и типы больших объектов.

  • char: представляет символьную строку фиксированной длины. Длина столбца может составлять от 1 до 2000 байтов.
  • varchar2: представляет строку символов переменной длины. Максимальная длина - 4000 байт.

Числовой тип (содержание в скобках [] необязательно): number [(p [, s])]. p означает точность, s означает количество десятичных знаков; он может хранить целые числа, числа с плавающей запятой и другие числовые типы; максимальная точность составляет 38 цифр.

  • CLOB: Символьный LOB (символьный LOB), способный хранить большие объемы символьных данных.
  • BLOB: двоичный LOB (двоичный LOB), который может хранить большие двоичные объекты, такие как графика, видеоклипы и звуковые файлы.

Ограничения - это способ автоматического поддержания целостности базы данных, обеспечиваемый Oracle. Он гарантирует целостность данных, ограничивая данные в полях, данные в записях и данные между таблицами.

Ограничение первичного ключа (первичный ключ): первичный ключ определяемой пользователем базовой таблицы. Это идентификатор, который однозначно определяет каждую запись в таблице. Его значение не может быть нулевым или повторяться, чтобы гарантировать целостность объекта. В таблице только один первичный ключ, но он может состоять из нескольких столбцов.

Ограничение уникальности: используется для указания уникальности объединенного значения одного или нескольких столбцов, чтобы предотвратить ввод повторяющихся значений в столбец.

Примечания к ограничениям уникальности:

  • Столбцы, использующие уникальные ограничения, могут быть пустыми.
  • В таблице допускается несколько уникальных ограничений.
  • Ограничение уникальности можно определить для нескольких столбцов.

Ограничение внешнего ключа: один или несколько столбцов, используемых для установления и усиления связи между данными двух таблиц. Ограничения внешнего ключа - единственные ограничения, которые определяют связь между двумя таблицами.

Примечания к ограничениям внешнего ключа:

  • При установке ограничений внешнего ключа поля первичной таблицы должны быть столбцами первичного ключа (или уникальными столбцами).
  • Соответствующие поля в главной и подчиненной таблицах должны иметь один и тот же тип данных.
  • Значение поля внешнего ключа во вторичной таблице должно происходить из значения соответствующего поля в первичной таблице или быть нулевым значением.

Что такое транзакция?

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

  • Один или несколько DML
  • DDL
  • DCL

Примечание: операторы DML должны использовать фиксацию для фиксации транзакции или использовать откат для отката транзакции; DDL и DCL автоматически фиксируются для транзакции.

Зачем использовать транзакции?

Обеспечьте безопасность и эффективность данных.

Когда выполняется операция транзакции (оператор DML), Oracle добавит блокировку таблицы в затронутую таблицу, чтобы другие пользователи не могли изменить структуру таблицы; в то же время он также добавит блокировку строки в активной строке, чтобы предотвратить выполнение других транзакций в соответствующей строке Операция DML.

Команды управления транзакцией:

  • Зафиксировать транзакцию (совершить)
  • Транзакция может быть отправлена ​​с помощью оператора фиксации.Когда оператор фиксации выполняется, изменение транзакции будет подтверждено, транзакция будет завершена, точка сохранения будет удалена, и блокировка будет снята.
  • Когда для завершения транзакции используется оператор фиксации, другие сеансы смогут просматривать новые данные после изменения транзакции.
  • Точка сохранения (savepoint): точка в транзакции, используемая для отмены части транзакции. Когда транзакция завершается, все точки сохранения, определенные транзакцией, будут автоматически удалены. При выполнении отката вы можете вернуться к указанной точке, указав точку сохранения.


Что такое словарь данных?

  • Словарь данных - это место, где Oracle хранит информацию о базе данных, и его цель - описать данные. Словарь данных базы данных - это набор таблиц и структуры.
  • К таблицам словаря данных нельзя получить доступ напрямую, но можно получить доступ к попыткам в словаре данных.

Роль словаря данных: через словарь данных мы можем понять информацию внутри базы данных. Когда пользователи сталкиваются с трудностями при работе с данными в базе данных, они могут получить доступ к словарю данных для просмотра подробной информации.

Словари данных, обычно используемые в Oracle: Словари данных, обычно используемые в Oracle, делятся на три категории, начинающиеся с трех префиксов:

  • user_ *: в этом представлении хранится информация об объектах, принадлежащих текущему пользователю. (Т.е. все объекты в пользовательском режиме)
  • all_ *: это представление хранит информацию об объектах, к которым текущий пользователь может получить доступ. (По сравнению с user_ *, all_ * не нужно владеть объектом, нужно только иметь разрешение на доступ к объекту)
  • dba_ *: это представление хранит информацию обо всех объектах в базе данных. (Предпосылка заключается в том, что текущий пользователь имеет доступ к этим базам данных, вообще говоря, должен иметь права администратора)

Словарь данных, обычно используемый в Oracle:


Используйте словарь данных для просмотра соответствующей информации о базе данных:

Читайте также: