Как вставить зарплату "NULL" в sql - PullRequest
1 голос
/ 23 апреля 2020

Как мне реализовать команду sql, которая выводит NULL для зарплаты, если это добровольный работник? Вот таблицы, которые я создал в первую очередь:

create Table worker (
pid integer references Person,
salary float);

create Table person(
pid integer primary key,
name varchar(30),
adress varchar(30));

Поскольку я не уверен, как отличить guish обычного работника от добровольного, я решил создать другую таблицу. К сожалению, я не знаю, как вставить значения NULL для зарплаты для всех добровольных работников. Вот что я попробовал:

create table voluntaryworker(
pid integer references Person,
salary = null);

insert into Person (pid, name, adress) values (1345, anna, 'festreet');
insert into voluntaryworker (pid, salary) values (1345, null);

pid = идентификатор человека

Ответы [ 3 ]

1 голос
/ 23 апреля 2020

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

create table voluntaryworker (
    pid integer references Person,
    salary generated always as (cast(null as float))
);

Точный синтаксис может варьироваться в зависимости от базы данных.

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

Кроме того, представление зарплаты как float довольно проблематично. В общем, вы никогда не должны использовать представления с плавающей запятой для денежных сумм. decimal / numeric гораздо больше подходит для денег.

0 голосов
/ 23 апреля 2020

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

Чтобы убедиться, что salary придерживается вашего правила, вы можете добавить ограничение CHECK :

CREATE TABLE worker (
  pid       integer PRIMARY KEY REFERENCES person
, voluntary boolean NOT NULL DEFAULT false
, salary    numeric
, CONSTRAINT voluntary_has_no_salary CHECK (NOT voluntary OR salary IS NULL)
);

Значение: у работников-добровольцев не может быть ненулевой заработной платы.

В качестве альтернативы, вы также можете опустить таблицу worker и просто добавить столбцы worker_salary и worker_voluntary в таблицу person. (Вам может понадобиться дополнительный флаг worker или объединить эту информацию в двух других столбцах ...)

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

Связанные:

0 голосов
/ 23 апреля 2020

Как минимум insert into voluntaryworker (pid) values (1354); оставляет значение NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...