У меня есть таблица с хромосомами (объекты с длиной) и таблица с областями (например, гены) на хромосомах (объекты с диапазоном, определяемым как два целых числа - начало позиции и позиция). Я бы хотел запретить вставку в области базы данных с координатами, превышающими длину конкретной хромосомы.Ограничение SQLite Ограничение CHECK
Возможно ли это в SQLite? Если это невозможно в любой другой системе SQL (желательно бесплатно)?
DROP TABLE IF EXISTS chromosomes;
CREATE TABLE chromosomes
(
chromosome_id INTEGER UNIQUE NOT NULL CHECK(TYPEOF(chromosome_id) = 'integer'),
name VARCHAR UNIQUE NOT NULL CHECK(TYPEOF(name) = 'text'),
length INTEGER NOT NULL CHECK(TYPEOF(length) = 'integer' AND length > 0),
PRIMARY KEY (chromosome_id)
);
DROP TABLE IF EXISTS genes;
CREATE TABLE genes
(
gene_id INTEGER UNIQUE NOT NULL CHECK(TYPEOF(gene_id) = 'integer'),
symbol VARCHAR NOT NULL CHECK(TYPEOF(symbol) = 'text'),
refseq_id VARCHAR NOT NULL CHECK(TYPEOF(refseq_id) = 'text'),
chromosome_id INTEGER NOT NULL CHECK(TYPEOF(chromosome_id) = 'integer'),
start INTEGER NOT NULL CHECK(TYPEOF(start) = 'integer' AND start > 0 AND start < end),
end INTEGER NOT NULL CHECK(TYPEOF(end) = 'integer' AND end > 0 AND end > start),
external_db_link VARCHAR NOT NULL CHECK(TYPEOF(external_db_link) = 'text'),
PRIMARY KEY (gene_id)
FOREIGN KEY (chromosome_id) REFERENCES chromosomes(chromosome_id)
);
Некоторые примеры данных могут помочь вам здесь, даже для тех, у кого есть биохимия. –
sqlite имеет ограничения. И, возможно, неплохо сделать проверку типа, как вы делаете, потому что sqlite не использует другие разумные типы принудительного применения! – e4c5
В Postgres вы можете определить ограничения исключения для типов диапазонов. Не уверен, что это сработает здесь (я ничего не знаю о представлении хромосом). Можете ли вы изменить свой вопрос и добавить некоторые примеры данных и как это ограничение должно применяться к этому? В Postgres вам не нужны такие вещи, как 'CHECK (TYPEOF (length) = 'integer'') –