Export to Xlsx or Json
last,
next,
previous,
first change
all,
none,
invert selection on the left,
all,
none,
invert selection on the right side
left selected items to the right side,
right selected items to the left side
selected items on the right side,
selected items on the right sideThis tab allows to compare definition of particular table:
Tab is divided into 3 major collapsible sections (Columns, Constraints and Options) and bottom panel for selected item details. Here is explanation of changes highlight annotation on the above screenshot:
Vertical toolbar between two panels contains additional tab-specific actions:
Open data diff for the current table
Open data diff for the current table filtered only to new and changed records
opens query result diff with select top 1000 records statement for this table
'Open table definition as text' opens text diff tab with table script generated by application
'Open dable definition from sqlite_master' opens text diff tab with table script provided by SQLite metadataOptions section shows STRICT and/or WITHOUT ROWID if any defined for table.
Constraints section includes PRIMARY KEY, UNIQUE, CHECK and FOREIGN KEY constraints - any constraint which can be defined on table level (like CREATE TABLE T(A, B, UNIQUE (A, B))), even if it was defined on column level (like CREATE TABLE T(A UNIQUE, B)). Constraints that can be defined only on column level (NOT NULL and DEFAULT) - they are presented in the Columns grid. UI does not show on which level constraint is defined (table or column), but 1) this can be checked using
'Open definition as text' command, and 2) application knows this level and tries to keep it during merge.
Constraints Columns column is either column on which it is defined (for column-level constraints), or it is columns listed explicitely in the table-level constraint definition for PRIMARY KEY, UNIQUE and FOREIGN KEY constraints. For table-level CHECK contraints Columns are not populated - related columns can be found in the CHECK expression in the Definition column.
It's pretty straightforward to identify column or option - whether it is the same or not, and therefore whether it is new, changed or unchanged. Columns and options are identified by their names. But for constraints it is not so trivial, there is no such kind of identifier. Application uses the following rules to identify constraint and understand whether it is new or changed:
Merge/delete actions use modified version of 12-steps method described in ALTER TABLE article from SQLite documentation. Here are these modifications:
Merge/delete actions may fail because of limitations caused by other objects such as foreign keys, existing data, DB engine limitations and so on. For example, new NOT NULL column without DEFAULT constraints can not be merged to the table with records - obvoiusly because these records will have no data in the new column and this will break NOT NULL constraint. Please check merge execution result for details.
If any new column with new constraints is selected without these constraints and then Merge action happens - then this column is merged without these constraints (it is a valid operation). But if new constraint for new column is selected without its column - then it is merged with that new column (otherwise it would be an invalid operation).