In Postgres and a number of other databases you cannot directly set a columns’ default value to come from another table. Here I talk through how you can setup another table and use a trigger to pull the value from that table and insert it as a default value into a field of your choice if on Insert the value is null.
Postgres
-- Parent table
CREATE TABLE t002defaultvalues (
gid bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
warehouse text
);
-- Stock table
CREATE TABLE t001stock (
gid bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
warehouse text
);
-- Function to fetch default warehouse
CREATE OR REPLACE FUNCTION set_default_warehouse()
RETURNS trigger AS $$
BEGIN
IF NEW.warehouse IS NULL THEN
SELECT warehouse
INTO NEW.warehouse
FROM t002defaultvalues
WHERE gid = 1; -- adjust if you want another rule
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- Trigger to apply the function
CREATE TRIGGER trg_t001stock_default_warehouse
BEFORE INSERT ON t001stock
FOR EACH ROW
EXECUTE FUNCTION set_default_warehouse();
SQL Server (T-SQL)
In SQL Server, defaults can’t reference other tables, so an AFTER INSERT trigger updates only the newly inserted rows (via the inserted pseudo-table).
-- Parent table
CREATE TABLE dbo.t002defaultvalues (
gid BIGINT IDENTITY(1,1) PRIMARY KEY,
warehouse NVARCHAR(MAX) -- TEXT is deprecated in SQL Server
);
-- Stock table
CREATE TABLE dbo.t001stock (
gid BIGINT IDENTITY(1,1) PRIMARY KEY,
warehouse NVARCHAR(MAX) NULL
);
GO
-- Trigger: fill warehouse from t002defaultvalues when NULL
CREATE TRIGGER dbo.trg_t001stock_default_warehouse
ON dbo.t001stock
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
UPDATE s
SET s.warehouse = dv.warehouse
FROM dbo.t001stock AS s
INNER JOIN inserted AS i
ON s.gid = i.gid
CROSS APPLY (
SELECT TOP (1) warehouse
FROM dbo.t002defaultvalues
WHERE gid = 1 -- adjust rule if needed
) AS dv
WHERE s.warehouse IS NULL;
END;
GO
-- Example
INSERT INTO dbo.t002defaultvalues (warehouse) VALUES (N'Main Depot');
INSERT INTO dbo.t001stock (warehouse) VALUES (NULL); -- will be set by trigger
MariaDB
In MariaDB, a BEFORE INSERT trigger can assign NEW.warehouse from a scalar subquery.
-- Parent table
CREATE TABLE t002defaultvalues (
gid BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
warehouse TEXT
);
-- Stock table
CREATE TABLE t001stock (
gid BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
warehouse TEXT NULL
);
DELIMITER $$
-- Trigger: fill warehouse from t002defaultvalues when NULL
CREATE TRIGGER trg_t001stock_default_warehouse
BEFORE INSERT ON t001stock
FOR EACH ROW
BEGIN
IF NEW.warehouse IS NULL THEN
SET NEW.warehouse = (
SELECT warehouse
FROM t002defaultvalues
WHERE gid = 1 -- adjust rule if needed
LIMIT 1
);
END IF;
END$$
DELIMITER ;
-- Example
INSERT INTO t002defaultvalues (warehouse) VALUES ('Main Depot');
INSERT INTO t001stock () VALUES (); -- will be set by trigger
Adjust WHERE gid = 1 to whatever selection rule you need (e.g., ORDER BY created_at DESC LIMIT 1, or WHERE active = 1 LIMIT 1).

































































