Hola, te sugiero lo siguiente (esto está en postgres 10):
CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -- as postgres user
CREATE TABLE teachers (
id bigserial NOT NULL PRIMARY KEY,
identifier uuid NOT NULL DEFAULT uuid_generate_v4(),
name CHARACTER VARYING(32) NOT NULL,
last_name CHARACTER VARYING(32) NOT NULL,
attention TIME NOT NULL
);
CREATE TABLE courses(
id bigserial NOT NULL PRIMARY KEY,
identifier uuid NOT NULL DEFAULT uuid_generate_v4(),
name CHARACTER VARYING(32) NOT NULL,
duration TIME NOT NULL,
teacher_id BIGINT NOT NULL REFERENCES public.teachers(id) ON DELETE CASCADE ON UPDATE CASCADE
);
Primero, no necesitas indicar el id del curso en la tabla del profesor, si llevas esto a la práctica no podrás crear la tabla profesores porque la tabla de cursos aun no existe y de todas maneras tampoco podrías ingresar un registro de profesor porque no existe el registro de curso y al reves, no puedes crear un curso porque no existe el profesor.
Segundo, debes declarar tus columnas si podrán estar nulos o no, esto es importante para mantener la integridad de la tabla.
Tercero, he agregado un identificador uuid para evitar exponer los id del lado del usuario y enumerar items, esto se considera una vulnerabilidad.
Cuarto, he utilizado bigint como id primario para aumentar la cantidad de registros soportados, esto añade escalabilidad a tu proyecto.
Quinto, he traducido las columnas y tablas al inglés, esto es una buena práctica, que tu sitio funcione con textos en español no quiere decir que el código deba estar en español, esto también ayuda en la escalabilidad del proyecto cuando necesites contratar a mas desarrolladores fuera de tu pais cuando el proyecto crezca.
Notas: Si te fijas, he mantenido el id separado del identificador, una opción hubiera sido utilizar únicamente el uuid como llave primaria pero esto aumentaría el coste de carga de la base de datos, por eso debes usar el id de manera interna para tus joins y el identificador para manipular desde tu front-end. La opción de cascada al eliminar se la puse para mantener la integridad de los datos, así si borran el profesor sus cursos también se eliminan ya que hemos declarado ese campo como no nulo, si quieres que el curso se mantenga entonces el campo debe ser nullable y la cascada debiera ejecutar un set null:
teacher_id BIGINT NULL REFERENCES public.teachers(id) ON DELETE SET NULL ON UPDATE CASCADE
Si te fijas, esta es una tabla de 1 a muchos, normalmente la tabla de 1 a 1 no debiera existir o no se debiera enseñar, pero en la práctica si es posible hacer esto aunque es un concepto complejo y útil en casos muy específicos, en tu caso no aplica, pero:
Una tabla de 1 a 1 quiere decir que un profesor sólo puede tener un curso y un curso sólo puede tener un profesor, esto en la práctica es imposible pero se puede solucionar de dos maneras: usando una tabla intermedia con dos llaves que les sean imposibles repetir o estableciendo el id del profesor de la tabla cursos como valor único.
Veamos:
teacher_id BIGINT NOT NULL REFERENCES public.teachers(id) UNIQUE ON DELETE CASCADE ON UPDATE CASCADE
De esta manera un profesor no podrá tener más de un curso y un curso no podrá tener más de un profesor, aunque esto es ridículo, pero esto sería de 1 a 1.
Será que tu profesor te ha querido gastar una broma?
Saludos.