¿Es posible hacer reference a una columna diferente en la misma tabla?

Si un blog tiene una tabla de "categorías" como la siguiente:

CREATE TABLE categories ( id INTEGER PRIMARY KEY AUTO_INCREMENT, parent_id INTEGER NOT NULL, name VARCHAR(30) NOT NULL, description TEXT, count INTEGER NOT NULL DEFAULT 0 ); 

Y si el campo parent_id está destinado a referirse al campo 'id' de la tabla de categorías, ¿cómo podría agregar una restricción que asegure que los valores insertados en parent_id hagan reference al campo id?

Simplemente quiero asegurarme de que solo los valores de identificación de categoría que existen se puedan usar como padres de una categoría recién insertada.

Sí, puede hacer reference a una columna en la misma tabla.

Pero esa columna debe ser nulable; de ​​lo contrario, no puede insert el primer logging.

 CREATE TABLE categories ( id INTEGER PRIMARY KEY AUTO_INCREMENT, parent_id INTEGER NULL, name VARCHAR(30) NOT NULL, description TEXT, count INTEGER NOT NULL DEFAULT 0, FOREIGN KEY (parent_id) REFERENCES categories(id) ); 

Tenga en count que después de la palabra key REFERENCES, el nombre de la tabla no es opcional, por lo que debe especificarlo incluso si hace reference a una columna en la misma tabla. De la documentation :

 reference_definition:
     REFERENCIAS tbl_name (index_col_name, ...)
       [COMPLETO COMPLETO |  PARTIDO PARCIAL |  MATCH SIMPLE]
       [ON DELETE reference_option]
       [ON UPDATE reference_option]

Véalo trabajar en línea: sqlfiddle

Solo usa una key externa normal:

 ALTER TABLE categories ADD CONSTRAINT FK_categories_Parent_ID REFERENCES categories (ID) 

Sin embargo, Parent_ID debe ser anulable ya que nunca podrás insert un logging

Puedes usar el siguiente enlace. Tiene cómo puede hacerlo database Oracle.

http://www.adp-gmbh.ch/ora/data_samples/hierarchic_yahoo.html

Gracias