'Construct a composite-capable FOREIGN KEY.
:param columns: A sequence of local column names. The named columns
must be defined and present in the parent Table. The names should
match the ``key`` given to each column (defaults to the name) unless
``link_to_name`` is True.
:param refcolumns: A sequence of foreign column names or Column
objects. The columns must all be located within the same Table.
:param name: Optional, the in-database name of the key.
:param onupdate: Optional string. If set, emit ON UPDATE <value> when
issuing DDL for this constraint. Typical values include CASCADE,
DELETE and RESTRICT.
:param ondelete: Optional string. If set, emit ON DELETE <value> when
issuing DDL for this constraint. Typical values include CASCADE,
DELETE and RESTRICT.
:param deferrable: Optional bool. If set, emit DEFERRABLE or NOT
DEFERRABLE when issuing DDL for this constraint.
:param initially: Optional string. If set, emit INITIALLY <value> when
issuing DDL for this constraint.
:param link_to_name: if True, the string name given in ``column`` is
the rendered name of the referenced column, not its locally assigned
``key``.
:param use_alter: If True, do not emit the DDL for this constraint as
part of the CREATE TABLE definition. Instead, generate it via an
ALTER TABLE statement issued after the full collection of tables
have been created, and drop it via an ALTER TABLE statement before
the full collection of tables are dropped. This is shorthand for the
usage of :class:`.AddConstraint` and :class:`.DropConstraint` applied
as "after-create" and "before-drop" events on the MetaData object.
This is normally used to generate/drop constraints on objects that
are mutually dependent on each other.
:param match: Optional string. If set, emit MATCH <value> when issuing
DDL for this constraint. Typical values include SIMPLE, PARTIAL
and FULL.
:param \**dialect_kw:  Additional keyword arguments are dialect specific,
and passed in the form ``<dialectname>_<argname>``.  See the
documentation regarding an individual dialect at :ref:`dialect_toplevel`
for detail on documented arguments.
.. versionadded:: 0.9.2'

def __init__(self, columns, refcolumns, name=None, onupdate=None, ondelete=None, deferrable=None, initially=None, use_alter=False, link_to_name=False, match=None, table=None, **dialect_kw):

    super(ForeignKeyConstraint, self).__init__(name, deferrable, initially, **dialect_kw)
    self.onupdate = onupdate
    self.ondelete = ondelete
    self.link_to_name = link_to_name
    if ((self.name is None) and use_alter):
        raise exc.ArgumentError('Alterable    Constraint    requires    a    name')
    self.use_alter = use_alter
    self.match = match
    self._elements = util.OrderedDict()
    for (col, refcol) in zip(columns, refcolumns):
        self._elements[col] = ForeignKey(refcol, _constraint=self, name=self.name, onupdate=self.onupdate, ondelete=self.ondelete, use_alter=self.use_alter, link_to_name=self.link_to_name, match=self.match, deferrable=self.deferrable, initially=self.initially, **self.dialect_kwargs)
    if (table is not None):
        self._set_parent_with_dispatch(table)
    elif (columns and isinstance(columns[0], Column) and (columns[0].table is not None)):
        self._set_parent_with_dispatch(columns[0].table)
