public TableForeignKeyConstraint(ConstraintName constraintName, Sequence<ColumnName> columnNames, Qualified<SchemaName, TableName> refTableName, Optional<Sequence<ColumnName>> refColumnNames, Sequence<ForeignKeyAction> keyActions): base(constraintName) {
			Debug.Assert(refTableName != null);
			this.columnNames = columnNames.ToList();
			this.refTableName = refTableName;
			this.refColumnNames = refColumnNames.ToList();
			this.keyActions = keyActions.ToList();
		}
		public ColumnUniqueConstraint(ConstraintName constraintName, ConstraintClusterToken clustered, IndexOptionGroup indexOptionGroup): base(constraintName, clustered, indexOptionGroup) {}
		protected ColumnNamedConstraintBase(ConstraintName constraintName) {
			this.constraintName = constraintName;
		}
		public TablePrimaryKeyConstraint(ConstraintName constraintName, ConstraintClusterToken clustered, Sequence<IndexColumn> indexColumns, IndexOptionGroup indexOptionGroup): base(constraintName, clustered, indexColumns, indexOptionGroup) {}
		public ColumnForeignKeyConstraint(ConstraintName constraintName, Qualified<SchemaName, TableName> tableName, Optional<ColumnName> refColumnName, Sequence<ForeignKeyAction> keyActions): base(constraintName) {
			Debug.Assert(tableName != null);
			this.tableName = tableName;
			this.refColumnName = refColumnName;
			this.keyActions = keyActions.ToList();
		}
		public AlterTableNocheckConstraintStatement(Qualified<SchemaName, TableName> tableName, TableCheckToken tableCheck, ConstraintName constraintName): base(tableName, tableCheck, constraintName) {}
		public TableCheckConstraint(ConstraintName constraintName, ReplicationToken replication, Predicate predicate): base(constraintName) {
			Debug.Assert(predicate != null);
			this.replication = replication;
			this.predicate = predicate;
		}
		protected AlterTableCheckConstraintStatementBase(Qualified<SchemaName, TableName> tableName, TableCheckToken tableCheck, ConstraintName constraintName): base(tableName) {
			this.tableCheck = tableCheck.TableCheck;
			this.constraintName = constraintName;
		}
		public ColumnDefaultConstraint(ConstraintName constraintName, Expression defaultValue): base(constraintName) {
			Debug.Assert(defaultValue != null);
			this.defaultValue = defaultValue;
		}
		public AlterTableDropConstraintStatement(Qualified<SchemaName, TableName> tableName, ConstraintName constraintName): base(tableName) {
			Debug.Assert(constraintName != null);
			this.constraintName = constraintName;
		}
		protected ColumnUniqueConstraintBase(ConstraintName constraintName, ConstraintClusterToken clustered, IndexOptionGroup indexOptionGroup): base(constraintName) {
			this.indexOptionGroup = indexOptionGroup;
			this.clustered = clustered.Clustered;
		}
		protected TableConstraint(ConstraintName constraintName) {
			this.constraintName = constraintName;
		}
		protected TableUniqueConstraintBase(ConstraintName constraintName, ConstraintClusterToken clustered, Sequence<IndexColumn> indexColumns, IndexOptionGroup indexOptionGroup): base(constraintName) {
			this.indexOptionGroup = indexOptionGroup;
			this.clustered = clustered.Clustered;
			this.indexColumns = indexColumns.ToList();
		}