(c1, c2, c3). También puede usar una expresión con un selector de columnas, como *, y/o modificadores como APPLY, EXCEPT, REPLACE.
Por ejemplo, considere la tabla:
b, puede hacerlo con la palabra clave EXCEPT. Según la sintaxis anterior, debe asegurarse de insertar tantos valores (VALUES (v11, v13)) como columnas especifique ((c1, c3)):
a y c rellenadas con los valores proporcionados, y b con el valor predeterminado. También es posible usar la palabra clave DEFAULT para insertar valores predeterminados:
- Los valores calculados a partir de las expresiones
DEFAULTespecificadas en la definición de la tabla. - Ceros y cadenas vacías, si no se han definido expresiones
DEFAULT.
INSERT ... VALUES:
Si quiere especificar
SETTINGS para la consulta INSERT, debe hacerlo antes de la cláusula FORMAT, ya que todo lo que aparece después de FORMAT format_name se interpreta como datos. Por ejemplo:Restricciones
Validación de tipos de datos
enable_time_time64_type, allow_suspicious_low_cardinality_types, allow_suspicious_fixed_string_types, etc.) solo durante la creación de tablas (CREATE TABLE) y la modificación del esquema (ALTER TABLE), no durante INSERT.
Esto significa que, si ya existe una tabla con un tipo de datos no permitido, se podrán insertar datos en ella aunque el ajuste correspondiente esté deshabilitado en el servidor. Esto es intencional: una vez creada una tabla, las inserciones no deben bloquearse por ajustes que controlan la creación de tipos.
Por ejemplo:
Como consecuencia, un cliente con una versión más reciente (en la que una configuración está habilitada de forma predeterminada) puede insertar datos con tipos de datos no permitidos en un servidor con una versión anterior (en la que la configuración está deshabilitada), siempre que la tabla de destino ya tenga los tipos de columna correspondientes. La validación se aplica en el nivel de DDL, no en el de DML.
Inserción de los resultados de SELECT
SELECT. Sin embargo, sus nombres en la expresión SELECT y en la tabla de INSERT pueden ser distintos. Si es necesario, se realiza una conversión de tipos.
Ninguno de los formatos de datos, excepto el formato Values, permite asignar valores a expresiones como now(), 1 + 2, etc. El formato Values permite un uso limitado de expresiones, pero no se recomienda, ya que en ese caso se utiliza código ineficiente para ejecutarlas.
No se admiten otras consultas para modificar data parts: UPDATE, DELETE, REPLACE, MERGE, UPSERT, INSERT UPDATE.
Sin embargo, puede eliminar datos antiguos con ALTER TABLE ... DROP PARTITION.
La cláusula FORMAT debe especificarse al final de la consulta si la cláusula SELECT contiene la función de tabla input().
Para insertar un valor predeterminado en lugar de NULL en una columna con un tipo de dato no anulable, habilite la configuración insert_null_as_default.
INSERT también admite CTE (expresiones de tabla comunes). Por ejemplo, las dos sentencias siguientes son equivalentes:
Inserción de datos desde un archivo
file_name y type son literales de cadena. El formato del archivo de entrada debe especificarse en la cláusula FORMAT.
Se admiten archivos comprimidos. El tipo de compresión se detecta a partir de la extensión del nombre del archivo. También puede especificarse explícitamente en una cláusula COMPRESSION. Los tipos admitidos son: 'none', 'gzip', 'deflate', 'br', 'xz', 'zstd', 'lz4', 'bz2'.
Esta funcionalidad está disponible en el cliente de línea de comandos y en clickhouse-local.
Ejemplos
Un solo archivo con FROM INFILE
Query
Response
Varios archivos con FROM INFILE usando globs
FROM INFILE 'input_*.csv.
Inserción con una función de tabla
Query
Response
Inserción en ClickHouse Cloud
INSERT se complete correctamente, los datos se escriben en el almacenamiento subyacente. Sin embargo, las réplicas pueden tardar un tiempo en recibir estas actualizaciones. Por lo tanto, si usas una conexión distinta que ejecuta una consulta SELECT en alguna de esas otras réplicas, es posible que los datos actualizados todavía no se hayan reflejado.
Es posible usar select_sequential_consistency para forzar que la réplica reciba las actualizaciones más recientes. Aquí tienes un ejemplo de una consulta SELECT que usa esta configuración:
select_sequential_consistency aumentará la carga en ClickHouse Keeper (utilizado internamente por ClickHouse Cloud) y puede ralentizar el rendimiento en función de la carga del servicio. Recomendamos no habilitar esta configuración salvo que sea necesario. La forma recomendada es ejecutar lecturas/escrituras en la misma sesión o usar un driver de cliente que utilice el protocolo nativo (y, por tanto, admita conexiones persistentes).
Inserción en una configuración replicada
INSERT. Esto difiere de ClickHouse Cloud, donde los datos se escriben de inmediato en almacenamiento compartido y las réplicas se suscriben a los cambios de metadatos.
Tenga en cuenta que, en las configuraciones replicadas, los INSERTs a veces pueden tardar bastante (del orden de un segundo), ya que requieren confirmar la operación en ClickHouse Keeper para el consenso distribuido. Usar S3 para el almacenamiento también añade latencia.
Consideraciones de rendimiento
INSERT ordena los datos de entrada por clave primaria y los divide en particiones según una clave de partición. Si se insertan datos en varias particiones a la vez, el rendimiento de la consulta INSERT puede reducirse significativamente. Para evitarlo:
- Añada datos en lotes bastante grandes, por ejemplo, 100,000 filas cada vez.
- Agrupe los datos por clave de partición antes de cargarlos en ClickHouse.
- Los datos se añaden en tiempo real.
- Se cargan datos que normalmente ya están ordenados por tiempo.
Inserciones asíncronas
async_insert.
Usar async_insert o el motor de tabla Buffer implica un almacenamiento en búfer adicional.
Inserciones grandes o prolongadas
max_insert_block_size filas.
Ver también