# TablePro 0.73: Copy a Table Into a Different Engine

> Copy To reads both databases, lists every type it had to approximate, and shows you the script before anything is written. Plus a Typesense driver.

September 9, 2026 · TablePro Team

TablePro 0.73 is out: 231 changes, 163 of them fixes.

Most of it lands in three places: moving data between databases, setting one up, and editing a SQLite table.

![TablePro Copy To review step copying the customers table from a MySQL shop database to a PostgreSQL copy, with a warning that identity and auto-increment values are written as they are, the expected row count, and the generated CREATE TABLE and CREATE INDEX statements beside them, above Cancel, Back and Copy buttons](https://tablepro.app/images/blog/blog-tablepro-0-73-1-light-1408.webp)

The review step is the whole feature: the DDL that will run, the rows each table expects, and every type it had to approximate.

## Copy a table into another engine

Right-click a table and pick **Copy To…**. The destination picker walks connection, then database, then schema, and the connection you land on does not have to run the same engine as the one you started from.

Rows stream between the two connections in batches, so a table larger than memory costs the same as a small one. When both sides turn out to be the same connection, the copy runs server-side as `INSERT … SELECT` instead of pulling every row through your Mac.

Nothing is written until you have read the script. **Continue** reads both databases and shows the DDL, the row count each table expects, what was left out, and the types it could not carry over exactly. A MySQL `TINYINT(1)` arriving in PostgreSQL is a decision, and you get to see the decision before it runs.

Each table takes its own `WHERE` and row limit from the funnel beside it, so you can copy last month rather than everything.

## The connection editor, and a tunnel that runs a command

The editor was up to eleven panes. It is four sections in a sidebar now, the same four for every driver: **General**, **Network**, **Options** and **Appearance**. **Test Connection**, **Cancel** and **Save** sit on a bar along the bottom, and when **Save** is dimmed the reason sits next to it, prefixed with the section holding the empty field.

![TablePro connection editor for a PostgreSQL connection, with a four-item sidebar reading General, Network, Options and Appearance, credential fields filling the pane, and Test Connection, Cancel and Save on a bar along the bottom](https://tablepro.app/images/blog/blog-tablepro-0-73-2-light-1408.webp)

Four sections, the same for every driver, with Test Connection, Cancel and Save on one bar along the bottom.

Network is where the five Enable switches went. **Connect via** is one picker now, listing Direct, SSH Tunnel, Cloudflare Tunnel, Cloud SQL Auth Proxy, SOCKS Proxy and Tunnel Command, because a connection only ever used one of them. Turning two on used to reach the database with neither applied.

**Tunnel Command** is new. A `kubectl port-forward` in a terminal is a window you cannot close and a tab you have to notice when it dies. Put it in the connection and it starts on connect, stops on disconnect, and comes back on its own. Two presets take named values rather than a command line, `kubectl port-forward` and `aws ssm start-session`, and **Custom Command** takes whatever you write, with `{port}`, `{host}` and `{remotePort}` substituted before it runs. Both presets look the tool up on `PATH` with `/usr/local/bin` and `/opt/homebrew/bin` added, because an app launched from the Dock does not inherit your shell's.

![TablePro Network section with Connect via set to Tunnel Command and the kubectl port-forward method selected, empty resource, namespace and context fields showing their placeholder text, an executable path, and a Will Run panel with the exact argument list and a {port} placeholder](https://tablepro.app/images/blog/blog-tablepro-0-73-3-light-1408.webp)

Will Run shows the exact argument list, with {port} standing in for the port allocated on connect.

## SQLite can edit foreign keys and column types

No SQLite version can add or drop a foreign key with `ALTER TABLE`, so TablePro recreates the table. It carries the rows over with their rowids, puts the indexes and triggers back, and ends in a `PRAGMA foreign_key_check` scoped to the table: rows that do not match the new key roll the whole rebuild back and the error names how many.

Column type, nullability and default changes take the same route, and a column renamed or dropped in the same save runs as its own `ALTER TABLE` afterwards, so the new name reaches every index, trigger and view.

![TablePro SQL Preview of 14 statements for adding a foreign key to a SQLite orders table, starting with PRAGMA foreign_keys = off, then the rebuilt table's CREATE TABLE with the customer_fk constraint and the INSERT SELECT that copies the rows, above Open in Query Editor, Cancel and Apply and Rebuild buttons](https://tablepro.app/images/blog/blog-tablepro-0-73-4-light-1368.webp)

The rebuild script is shown before it runs, and it ends by checking the rows against the key you just added.

The Foreign Keys tab also stopped offering Add and Remove on engines that cannot do either, and stopped offering referential actions the engine rejects.

## The toolbar and the row inspector

The toolbar is five icon-only groups, with the connection and the container as one centred control that switches either. Query duration and **Stop** moved down to the results status bar, where the query is.

The row inspector puts the column name and type on one line and the value at full width below it, which is the shape a long value needed. Every field carries a value menu with `Ctrl+Option+N` for NULL and `Ctrl+Option+D` for DEFAULT, `Tab` moves between fields, and there is a search field and an edited-fields-only filter above them. The Assistant is its own pane now rather than a tab in the inspector, on **View > Show Assistant** or `Cmd+Option+A`.

**Toolbar arrangements reset once on first launch**, to the new default set. A customised toolbar from 0.72 does not survive.

## Also new

- **Typesense driver**: collection browsing, document editing, a REST request console, API keys in Users & Roles, and Server Dashboard metrics. Install it from **Settings > Plugins**
- **DuckDB backup and restore**: one `.duckdb` file or a folder of Parquet, plus **Release File Lock**, an **Open the File Read-Only** option so several processes share one file, and per-connection idle release for DuckDB and MySQL
- **Indexes in SQL exports**, written after the data, with a materialized view's indexes written once the view exists
- **A bar column in the EXPLAIN tree**, with a Metric menu for self cost, self time and row counts
- **Image preview** beside the source for a cell holding SVG or a raster image
- **Encoding and byte order mark options for CSV export**, with a warning naming what the encoding dropped
- **A sort direction setting**, which sets the default row sort and which way the first header click sorts

## `~/.ssh/config`, read properly

Eleven separate parsing bugs are gone. `%h`, `%p` and `%r` reached the connection as literal text. An `Include` line naming more than one file read none of them, and the same file included from a second `Host` block contributed nothing. `Match !host` and the other negated criteria matched every host. `Match final` overrode values earlier blocks had already set, and a later `Match` block dropped the `IdentityFile` entries from earlier ones. A jump host's own `ProxyJump` was not followed, so a chained bastion was never reached.

## What it will not do

Copying inside one engine drops generated and computed columns from the write, because the server recomputes them and every engine that has them rejects an `INSERT` naming one. Crossing to another engine they arrive as ordinary columns holding the values they had.

On Turso, remote libSQL and Cloudflare D1, TablePro shows you the rebuild script but does not run it. Each statement there is its own HTTP request, and nothing can hold a rebuild in one transaction.

The Constraints tab's **+** and **-** need SQLite 3.53.0 or later, the release that added `ADD CONSTRAINT` and `DROP CONSTRAINT`. The driver links the system SQLite, so the version is whatever your macOS ships. On an older one the constraints still list, read-only.

Changing a primary key on an existing table still does nothing on SQLite, libSQL, ClickHouse, Oracle and Trino.

## Getting it

TablePro checks for updates on its own, or **TablePro > Check for Updates…** now. A fresh copy is on [tablepro.app](https://tablepro.app).

This release moves the plugin ABI to version 25. The change is additive, so the plugins you have keep working. Reinstall the SQLite, libSQL, Cloudflare D1, MSSQL, Oracle, Dameng, Cassandra and DuckDB drivers from **Settings > Plugins** to pick up the index and constraint export fixes.
