Как сделать поле обязательным в sql
Перейти к содержимому

Как сделать поле обязательным в sql

  • автор:

Mysql: как правильней организовать необязательную связь полей в таблицах

Есть 2 таблицы queries и orders . Поле orders.query_id связано с полем queries.id через внешний ключ, но эта связь не является обязательной, то есть, orders не обязательно должен быть связан с queries , например когда пользователю начисляются бонусные баллы за первую регистрацию создается запись в orders , но она не привязана к конкретному запросу в queries . В данном случае, нельзя создать запись в orders если нет соответствующей записи в queries . Как поступить в этом случае с индексацией query_id в таблице orders ?

  • Нужно ли убирать индекс?
  • Нужно ли добавить в queries дефолтную строку, например с id=0 как раз для таких случаев?
  • Или вообще убрать «явную» связь в базе данных и оставить только программную?

Отслеживать
задан 28 янв 2018 в 14:53
2,112 1 1 золотой знак 8 8 серебряных знаков 18 18 бронзовых знаков

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Если запись в orders ни к чему не привязана, то оставляйте поле query_id не заполненным, т.е. равным NULL. (для этого при объявлении поля оно должно быть объявлено как допускающее NULL значения). Больше ничего делать не надо. Ключ не мешает существованию записей с NULL. Индексы так же никак не влияют.

Отслеживать
ответ дан 28 янв 2018 в 15:00
44.1k 3 3 золотых знака 35 35 серебряных знаков 66 66 бронзовых знаков
Спасибо, ровно то, что нужно
28 янв 2018 в 15:02

  • mysql
  • sql
  • база-данных
  • индексация
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.15.1019

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Как сделать поле обязательным в sql

При создании столбцов в T-SQL мы можем использовать ряд атрибутов, ряд которых являются ограничениями. Рассмотрим эти атрибуты.

PRIMARY KEY

С помощью выражения PRIMARY KEY столбец можно сделать первичным ключом.

CREATE TABLE Customers ( Id INT PRIMARY KEY, Age INT, FirstName NVARCHAR(20), LastName NVARCHAR(20), Email VARCHAR(30), Phone VARCHAR(20) )

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

Установка первичного ключа на уровне таблицы:

CREATE TABLE Customers ( Id INT, Age INT, FirstName NVARCHAR(20), LastName NVARCHAR(20), Email VARCHAR(30), Phone VARCHAR(20), PRIMARY KEY(Id) )

Первичный ключ может быть составным (compound key). Такой ключ может потребоваться, если у нас сразу два столбца должны уникально идентифицировать строку в таблице. Например:

CREATE TABLE OrderLines ( OrderId INT, ProductId INT, Quantity INT, Price MONEY, PRIMARY KEY(OrderId, ProductId) )

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

IDENTITY

Атрибут IDENTITY позволяет сделать столбец идентификатором. Этот атрибут может назначаться для столбцов числовых типов INT, SMALLINT, BIGINT, TYNIINT, DECIMAL и NUMERIC. При добавлении новых данных в таблицу SQL Server будет инкрементировать на единицу значение этого столбца у последней записи. Как правило, в роли идентификатора выступает тот же столбец, который является первичным ключом, хотя в принципе это необязательно.

CREATE TABLE Customers ( Id INT PRIMARY KEY IDENTITY, Age INT, FirstName NVARCHAR(20), LastName NVARCHAR(20), Email VARCHAR(30), Phone VARCHAR(20) )

Также можно использовать полную форму атрибута:

IDENTITY(seed, increment)

Здесь параметр seed указывает на начальное значение, с которого будет начинаться отсчет. А параметр increment определяет, насколько будет увеличиваться следующее значение. По умолчанию атрибут использует следующие значения:

IDENTITY(1, 1)

То есть отсчет начинается с 1. А последующие значения увеличиваются на единицу. Но мы можем это поведение переопределить. Например:

Id INT IDENTITY (2, 3)

В данном случае отсчет начнется с 2, а значение каждой последующей записи будет увеличиваться на 3. То есть первая строка будет иметь значение 2, вторая — 5, третья — 8 и т.д.

Также следует учитывать, что в таблице только один столбец должен иметь такой атрибут.

UNIQUE

Если мы хотим, чтобы столбец имел только уникальные значения, то для него можно определить атрибут UNIQUE .

CREATE TABLE Customers ( Id INT PRIMARY KEY IDENTITY, Age INT, FirstName NVARCHAR(20), LastName NVARCHAR(20), Email VARCHAR(30) UNIQUE, Phone VARCHAR(20) UNIQUE )

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

Также мы можем определить этот атрибут на уровне таблицы:

CREATE TABLE Customers ( Id INT PRIMARY KEY IDENTITY, Age INT, FirstName NVARCHAR(20), LastName NVARCHAR(20), Email VARCHAR(30), Phone VARCHAR(20), UNIQUE(Email, Phone) )

NULL и NOT NULL

Чтобы указать, может ли столбец принимать значение NULL, при определении столбца ему можно задать атрибут NULL или NOT NULL . Если этот атрибут явным образом не будет использован, то по умолчанию столбец будет допускать значение NULL. Исключением является тот случай, когда столбец выступает в роли первичного ключа — в этом случае по умолчанию столбец имеет значение NOT NULL.

CREATE TABLE Customers ( Id INT PRIMARY KEY IDENTITY, Age INT, FirstName NVARCHAR(20) NOT NULL, LastName NVARCHAR(20) NOT NULL, Email VARCHAR(30) UNIQUE, Phone VARCHAR(20) UNIQUE )

DEFAULT

Атрибут DEFAULT определяет значение по умолчанию для столбца. Если при добавлении данных для столбца не будет предусмотрено значение, то для него будет использоваться значение по умолчанию.

CREATE TABLE Customers ( Id INT PRIMARY KEY IDENTITY, Age INT DEFAULT 18, FirstName NVARCHAR(20) NOT NULL, LastName NVARCHAR(20) NOT NULL, Email VARCHAR(30) UNIQUE, Phone VARCHAR(20) UNIQUE );

Здесь для столбца Age предусмотрено значение по умолчанию 18.

CHECK

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

CREATE TABLE Customers ( Id INT PRIMARY KEY IDENTITY, Age INT DEFAULT 18 CHECK(Age >0 AND Age < 100), FirstName NVARCHAR(20) NOT NULL, LastName NVARCHAR(20) NOT NULL, Email VARCHAR(30) UNIQUE CHECK(Email !=''), Phone VARCHAR(20) UNIQUE CHECK(Phone !='') );

Здесь также указывается, что столбцы Email и Phone не могут иметь пустую строку в качестве значения (пустая строка не эквивалентна значению NULL).

Для соединения условий используется ключевое слово AND . Условия можно задать в виде операций сравнения больше (>), меньше (<), не равно (!=).

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

CREATE TABLE Customers ( Id INT PRIMARY KEY IDENTITY, Age INT DEFAULT 18, FirstName NVARCHAR(20) NOT NULL, LastName NVARCHAR(20) NOT NULL, Email VARCHAR(30) UNIQUE, Phone VARCHAR(20) UNIQUE, CHECK((Age >0 AND Age<100) AND (Email !='') AND (Phone !='')) )

Оператор CONSTRAINT. Установка имени ограничений.

С помощью ключевого слова CONSTRAINT можно задать имя для ограничений. В качестве ограничений могут использоваться PRIMARY KEY, UNIQUE, DEFAULT, CHECK.

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

CREATE TABLE Customers ( Id INT CONSTRAINT PK_Customer_Id PRIMARY KEY IDENTITY, Age INT CONSTRAINT DF_Customer_Age DEFAULT 18 CONSTRAINT CK_Customer_Age CHECK(Age >0 AND Age < 100), FirstName NVARCHAR(20) NOT NULL, LastName NVARCHAR(20) NOT NULL, Email VARCHAR(30) CONSTRAINT UQ_Customer_Email UNIQUE, Phone VARCHAR(20) CONSTRAINT UQ_Customer_Phone UNIQUE )

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

  • "PK_" - для PRIMARY KEY
  • "FK_" - для FOREIGN KEY
  • "CK_" - для CHECK
  • "UQ_" - для UNIQUE
  • "DF_" - для DEFAULT

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

И также можно задать все имена ограничений через атрибуты таблицы:

CREATE TABLE Customers ( Id INT IDENTITY, Age INT CONSTRAINT DF_Customer_Age DEFAULT 18, FirstName NVARCHAR(20) NOT NULL, LastName NVARCHAR(20) NOT NULL, Email VARCHAR(30), Phone VARCHAR(20), CONSTRAINT PK_Customer_Id PRIMARY KEY (Id), CONSTRAINT CK_Customer_Age CHECK(Age >0 AND Age < 100), CONSTRAINT UQ_Customer_Email UNIQUE (Email), CONSTRAINT UQ_Customer_Phone UNIQUE (Phone) )

Как изменить запросом обязательное поле на необязательное?

Если нет связанных полей, то 4 запроса:
1. Копия нужной таблицы
SELECT original.* INTO temp FROM original
2. Удаление оригинальной
DELETE original.* FROM original
3. Копия обратно в оригинал
SELECT temp.* INTO original FROM temp
4. Удаление копии
DELETE temp.* FROM temp

Если есть связи с другими таблицами, то создать новое поле и далее перенастроить связи на него
ALTER table original add Column [имя столбца] Double

Ответ написан более трёх лет назад

Комментировать

Нравится Комментировать

Ваш ответ на вопрос

Войдите, чтобы написать ответ

sql

  • SQL
  • +1 ещё

Массив структур в Hive. Как проверить вхождение в массив структуры по маске?

  • 1 подписчик
  • вчера
  • 72 просмотра

Как сделать поле обязательным в sql

В АВАР/4 существует два типа полей ввода для стандартного экрана выбора:

Parameters Единичные поля
Select-Options Внутренние таблицы для задания составных критериев выборки
(рекомендуется для динамических предложений where и операторов select)
Определение критерия как параметра или составного критерия выборки автоматически задает соответствующее поле ввода на экране выбора, а также структуру данных в программе для сохранения введенной пользователем информации. С программной точки зрения критерии выборки Logical Database и данных отчета определяются одинаково. Различие лишь в том, что специфичные для данного отчета критерии выборки расположены на экране ниже критериев Logical Database. Заметим, что при создании отчета можно использовать поля ввода (для параметров и составных критериев), относящиеся к критериям Logical Database.

Задание обязательных для ввода данных:

parameters р_city like customer-city obligatory .
select-options s_name for customers-name obligatory .

Даринка написал(а):

а как можно поставить условие (например выбираются все поля из списка, если мы это поле пропускаем и не выбираем)

Цитата:

Использование Select-Options в операторе select

Составной критерий выборки предназначен для использования в предложении where оператора select. Так, если пользователю необходимо получить список клиентов с фамилиями, начинающимися на буквы А — М, то программа будет иметь следующий вид:
tables customers.
select-options s_name for customers-name.
select * from customers where name in s_ name.
write / customers-name.
endselect.
При запуске программы-отчета пользователь может задать критерии выборки.
В этом случае оператор select будет определять общее количество соответствующих клиентов, записанных в таблице базы данных customers. Приведенная программа-отчет будет эквивалентна следующей:
select * from customers where name between 'A' and 'M' .
write / customers-name.
endselect.
Очевидно, что Select-Options обеспечивает задание дополнительных критериев выборки без изменения исходного текста программы. Предположим, нужно выбрать всех клиентов, чьи фамилии начинаются на букву Е, с фамилией Smith, а также все фамилии в диапазоне от буквы М до Shultz. Для этого нажмите кнопку Complex Selections справа от поля ввода критерия для клиентов. В появившемся диалоговом окне введите Е*, а в части окна под названием Single Value Selections (одно значение выборки) — Smith. В части окна Ranges (диапазон) задайте границы М и Shultz. При нажатии кнопки Copy (копировать) все критерии, заданные в диалоговом окне, копируются в составной крите¬рий выборки, и на экран опять выводится стандартное окно выбора, где можно продолжить ввод или запустить программу создания отчета на выполнение. Нажав кнопку Selection Options, можно ввести дополнительные критерии выборки.
Составные критерии часто применяются при создании отчетов с помощью логической базы данных. Например, критерий выборки учебного отчета определяется через соответствующую Logical Database.
Каждый элемент Select-Option содержит ссылку на определенное поле (например, customers-name), которое указано после дополнения for и с которым производится сравнение в предложении where. Вся подстановка (на уровне select) осуществляется средствами логической базы данных после извлечения информации из таблиц реальной базы данных. Однако составной критерий для предложения where можно применять и в том случае, если информация не содержится в таблицах, принадлежащих логи¬ческой базе (в частности, можно создать отчет, считывая все данные без логической базы данных). Аналогичным образом составной критерий используется и в других операторах SQL, и они могут быть переданы в программу-отчет, запущенную командой submit .

Заголовок сообщения: Re: как задать обязательное для заполнения поле?
Добавлено: Ср, янв 23 2008, 10:02
Даринка написал(а):

как задать обязательное для заполнения поле , я <я не знать русский языка>, услышала, что есть message по событию, а как можно поставить условие (например выбираются все поля из списка, если мы это поле пропускаем и не выбираем)

не совсем понял вопрос. если нужно сделать поле parameters или select-options на селекционном экране обязательным для заполнения, то в конце его описания приписывается слово obligatory. а чтобы выбирать все возможные значения оператором select с ограничением по этому полю, то поле не надо делать обязательным для ввода. когда оно будет не заполнено на экране, ограничение по нему не сработает и выберутся все значения.

Заголовок сообщения: Re: как задать обязательное для заполнения поле?
Добавлено: Ср, янв 23 2008, 10:12
Даринка написал(а):

как можно поставить условие (например выбираются все поля из списка, если мы это поле пропускаем и не выбираем)

Если не хотим писать IF и два разных select'а, то можно воспользоваться ranges:
data: r_matnr type range of mara-matnr.
select * from mara
where matnr in r_matnr.

Если введённое пользователем значение пустое, то оставляем таблицу r_matnr пустой. Иначе добавляем туда строку.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *